java – 在swing应用程序中保留键盘布局?
发布时间:2020-12-15 02:59:58 所属栏目:Java 来源:网络整理
导读:我有一个 Java Swing应用程序,它生成带有文本控件的子对话框.问题是,当您在子对话框中更改键盘布局时,它会在关闭对话框后立即更改. 我需要的是无论是在主框架还是在儿童框架中切换,在切换后都要保持的键盘布局. 这是一个说明问题的SSCCE: import javax.swin
我有一个
Java Swing应用程序,它生成带有文本控件的子对话框.问题是,当您在子对话框中更改键盘布局时,它会在关闭对话框后立即更改.
我需要的是无论是在主框架还是在儿童框架中切换,在切换后都要保持的键盘布局. 这是一个说明问题的SSCCE: 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); } } 解决方法
好的,我刚刚解决了这个解决方案:
在main()方法中添加了一个java工具包的监听器,如下所示: AWTEventListener awtWindowListener = new AWTEventListener() { @Override public void eventDispatched(AWTEvent event) { if (event instanceof WindowEvent) { if (WindowEvent.WINDOW_CLOSED == event.getID() || WindowEvent.WINDOW_CLOSING == event.getID()) { Window child = ((WindowEvent) event).getWindow(); Window parent = SwingUtilities.getWindowAncestor(child); if (parent == null) return; InputContext childIC = child.getInputContext(); parent.getInputContext().selectInputMethod(childIC.getLocale()); } } } }; Toolkit.getDefaultToolkit().addAWTEventListener(awtWindowListener,AWTEvent.WINDOW_EVENT_MASK); 它适用于使用父窗口生成的所有子对话框作为构造函数参数.在关闭事件中,子对话框的InputContext中的Locale被放入其父窗口的InputContext中. 可能有一些更好的方法. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |