title: Preserving keyboard layout in swing app?
body: <p>I have a Java Swing application wich spawns child dialogs with text controls. And the problem is that when you change keyboard layout in child dialog, it changes back right after the dialog is closed.</p>
  
  <p>What I need is the keboard layout to stay after being switched whether it was switched in the main frame or in a child frame.</p>
  
  <p>Here is a SSCCE that illustrates the problem:</p>
  
  <pre class="lang-java prettyprint-override"><code>import javax.swing.*;
  import java.awt.*;
  import java.awt.event.ActionEvent;
  import java.awt.event.ActionListener;
  
  public class InheritInputContext {
  
      public static void main(String[] arg) {
          final MainFrame mainFrame = new MainFrame();
          SwingUtilities.invokeLater(new Runnable() {
              @Override
              public void run() {
                  mainFrame.setPreferredSize(new Dimension(300, 400));
                  mainFrame.pack();
                  mainFrame.setLocationRelativeTo(null);
                  mainFrame.setVisible(true);
              }
          });
  
      }
  }
  
  
  class MainFrame extends JFrame {
  
      MainFrame() {
          setLayout(new BorderLayout());
          JTextArea textArea = new JTextArea();
          add(textArea, BorderLayout.CENTER);
  
          JButton dialogBtn = new JButton("Dialog");
          add(dialogBtn, BorderLayout.SOUTH);
          dialogBtn.addActionListener(new ActionListener() {
              @Override
              public void actionPerformed(ActionEvent e) {
                  ChildDialog cd = new ChildDialog(MainFrame.this);
                  cd.setPreferredSize(new Dimension(200, 200));
                  cd.setLocationRelativeTo(MainFrame.this);
                  cd.pack();
                  cd.setVisible(true);
              }
          });
      }
  }
  
  
  class ChildDialog extends JDialog {
  
      ChildDialog(Window w) {
          super(w);
          JTextArea textArea = new JTextArea();
          getContentPane().add(textArea);
      }
  }
  </code></pre>