JAVA中的一些奇怪的行为

时间:2014-06-13 13:58:10

标签: java swing

我创建了简单的代码片段来演示JAVA的一些奇怪的东西。

public class Start extends JFrame {

    public static JFrame mainFrame; 

    public static void main(String[] args) {

        JFrame f = new JFrame();
        mainFrame = f;
        f.setSize(400, 400);

        Action btn_action = new AbstractAction() {
            public void actionPerformed(ActionEvent arg0) {
                System.out.println("test");
                JDialog d = new JDialog(mainFrame, "Test Dialog", true);
                d.setSize(200, 200);
                d.setLocationRelativeTo(null);
                JTextField text = new JTextField();
                d.add(text);
                d.setVisible(true);
            }
        };

        JButton btn = new JButton(btn_action);
        btn.setText("Click me");
        KeyStroke btnShortcut = KeyStroke.getKeyStroke(KeyEvent.VK_1, 0);
        btn.getActionMap().put("btn_click", btn_action);
        btn.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(btnShortcut, "btn_click");
        f.add(btn);
        f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }
}

我有JFrame组件,上面有JButtonJButton有一个快捷方式(键盘号1)。

当我在键盘顶行按1时,操作正在执行。它正在使用一个组件创建JDialog - JTextField1。关于什么是奇怪的

当我按JTextField时,该号码有时会打印在JDialog JDialog区域内。它有时会发生。它似乎取自键盘缓冲区。

如何在{{1}}开放之前清除它?还是有另一种解决方案吗?

提前致谢。

1 个答案:

答案 0 :(得分:5)

尝试绑定到密钥释放事件,而不是按键事件,以便在对话框打开时明确释放密钥:

KeyStroke btnShortcut = KeyStroke.getKeyStroke(KeyEvent.VK_1, 0, true);
                                                                 ^^^^