2

次の例のボタンにキー リスナーまたはキー バインディングを追加する際に助けが必要です。キーボードで A または B を押したときに、マウスで押したときと同じアクションを実行したい。

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class NetTest {

    static JButton btnA = new JButton("A");
    static JButton btnB = new JButton("B");
    static JPanel jp = new JPanel();
    static JFrame jf = new JFrame("Test APP");
    static JLabel jl = new JLabel("Which button was clicked ?");

    static ActionListener action = new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            jl.setText(((JButton)e.getSource()).getText());
        }
    };

    public static void main(String[] args) {
        jf.setVisible(true);
        jf.setSize(400, 400);
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        jp.add(btnA);
        jp.add(btnB);
        jp.add(jl);
        jf.add(jp);

        btnA.addActionListener(action);
        btnB.addActionListener(action);
    }
}
4

2 に答える 2

3

リッスンするKeyEventsには、JComponent#getInputMap()およびJComponent#getActionMap()メソッドを使用して、リッスンする入力イベントと対応するアクションを配置する必要があります。この例を試してください:

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class Demo{

    private void initGUI(){
        AbstractAction buttonPressed = new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println(e.getActionCommand());
            }
        };

        JButton submit = new JButton("Submit");
        submit.addActionListener(buttonPressed);

        /*
         * Get the InputMap related to JComponent.WHEN_IN_FOCUSED_WINDOW condition
         * to put an event when A key is pressed
         */
        submit.getInputMap(javax.swing.JComponent.WHEN_IN_FOCUSED_WINDOW).
                put(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_A,0), "A_pressed");
        /*
         * Add an action when the event key is "A_pressed"
         */
        submit.getActionMap().put("A_pressed", buttonPressed);

        /*
         * Same as above when you press B key
         */
        submit.getInputMap(javax.swing.JComponent.WHEN_IN_FOCUSED_WINDOW).
                put(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_B,0), "B_pressed");
        submit.getActionMap().put("B_pressed", buttonPressed);

        JPanel content = new JPanel(new FlowLayout());
        content.add(new JLabel("Test:"));
        content.add(submit);

        JFrame frame = new JFrame("Demo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setContentPane(content);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                new Demo().initGUI();
            }
        });

    }
}

注:この例ではAbstractAction、 または A/B キーが押されたときに同じものを使用しJButtonますが、出力はイベント ソースが誰であるかによって異なります。

注 2:条件を使用するJComponent.WHEN_IN_FOCUSED_WINDOWと、キー A または B が押されるたびにアクションが実行されます。JTextfieldまたはなどのテキスト入力コンポーネントがJTextAreaあり、最終ユーザーが A キーまたは B キーを何度も押すことがほぼ確実な場合、この動作は望ましくありません。その場合は、JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT条件を使用する必要があります。

于 2013-09-28T12:38:37.840 に答える
2

あなたが達成したいことを理解していれば、基本的には、2 つの特定のキーボード イベント (キー "A" または "B" が押された) をリッスンし、2 つの JButton のいずれかをクリックしたかのようにラベルを切り替えます。

フレームに KeyListener を追加し、「A」または「B」の入力のみに応答するようにそのコールバックを実装するだけです。また、JFrame オブジェクトで setFocusable(false) を呼び出すことを忘れないでください

    jf.setFocusable(true);
    jf.addKeyListener( new KeyListener() {

        @Override
        public void keyTyped( KeyEvent evt ) {
        }

        @Override
        public void keyPressed( KeyEvent evt ) {
        }

        @Override
        public void keyReleased( KeyEvent evt ) {
        }
    } );
于 2013-09-28T12:39:39.223 に答える