java – 在swing应用程序中保留键盘布局?
发布时间:2020-05-25 00:06:41 所属栏目:Java 来源:互联网
导读:我有一个 Java Swing应用程序,它生成带有文本控件的子对话框.问题是,当您在子对话框中更改键盘布局时,它会在关闭对话框后立即更改. 我需要的是无论是在主框架还是在儿童框架中切换,在切换后都要保持的键盘布局. 这是一个说明问题的SSCCE: import javax.swing
|
我有一个 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中. 可能有一些更好的方法. (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
