0

我正在尝试使用“Alt”键在 Java 中的两个 JTextField 之间切换。我已经使用了代码:

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

现在,这种类型的代码可以工作,但不能正常工作。我需要按两次“Alt”键才能真正切换。不仅对于那个键,所有其他键都会发生这种情况 - 立即下一次按键被忽略,即,我需要键入两次才能按相同的键。

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

4

2 回答 2

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
    }
}

我希望它有所帮助。干杯

于 2012-10-29T21:27:32.147 回答
1

我会改用键绑定 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();
                    }
                }
            });

        }

    }

}
于 2012-10-30T00:06:03.767 回答