Alt键在JTextField中无法正常工作

时间:2012-10-29 21:21:39

标签: java jtextfield keylistener key-bindings alt

我正在尝试使用'Alt'键在Java中的两个JTextField之间切换。我使用过代码:

private void GetAltKey(java.awt.event.KeyEvent evt) {
        if (evt.isAltDown()) {
            this.GetVectorDirect(true); //Select another JTextField
        }
}

现在,这种类型的代码正在运行,但不正确。我需要按两次“Alt”键才能实际切换。不仅对于那个键,它发生在所有其他键上 - 忽略下一次按键,即我需要键入两次按相同的键。

有什么更好的方法可以做到这一点?

2 个答案:

答案 0 :(得分:1)

这种情况正在发生,因为你要按的第一个alt是触发GetAltKey事件(顺便说一句,考虑改为getAltKey),请注意,当发生这种情况时,你的alt键不是向下,所以你的evt.isAltDown()返回false。

解决方案很简单,将evt.isAltDown()方法更改为evt.getKeyCode() == KeyEvent.VK_ALT

private void getAltKey(java.awt.event.KeyEvent evt) {
    if (evt.getKeyCode() == KeyEvent.VK_ALT) {
        this.GetVectorDirect(true); //Select another JTextField
    }
}

我希望它有所帮助。干杯

答案 1 :(得分:1)

我会使用key bindings API代替,关键的监听器往往会很麻烦,并且通常会产生很多混乱的if-else语句。

public class KeyBindingsTransfer {

    public static void main(String[] args) {
        new KeyBindingsTransfer();
    }

    public KeyBindingsTransfer() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException ex) {
                } catch (InstantiationException ex) {
                } catch (IllegalAccessException ex) {
                } catch (UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new TransferPane());
                frame.setSize(200, 200);
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    protected class TransferPane extends JPanel {

        private JTextArea left;
        private JTextArea right;

        public TransferPane() {
            setLayout(new GridLayout(1, 2, 4, 4));

            left = new JTextArea();
            right = new JTextArea();

            add(left);
            add(right);

            InputMap inputMap = getInputMap(WHEN_IN_FOCUSED_WINDOW);
            inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_ALT, 0, true), "transferOnAlt");

            ActionMap actionMap = getActionMap();
            actionMap.put("transferOnAlt", new AbstractAction() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    System.out.println("Clicked");
                    if (left.hasFocus()) {
                        right.requestFocusInWindow();
                    } else if (right.hasFocus()) {
                        left.requestFocusInWindow();
                    }
                }
            });

        }

    }

}