0

「Alt」キーを使用して、Javaで2つのJTextFieldを切り替えようとしています。私はコードを使用しました:

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

現在、このタイプのコードは機能していますが、正しくは機能していません。実際に切り替えるには、「Alt」キーを2回押す必要があります。そのキーだけでなく、他のすべてのキーでも発生します。すぐ次のキーの押下は無視されます。つまり、同じキーを2回押すには入力する必要があります。

これを行うためのより良い方法は何ですか?

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 に答える