10

JPanel で Java でキー バインディングを作成しようとしています。「w」ボタンを押したときに特定のアクションを実行したい。バインディングの作成に関する Java チュートリアルに従いましたが、actionPerformed メソッドが実行されません (つまり、テキストが出力されません)。以下は、テスト GUI のコード全体で、関連する部分が強調表示されています。

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;

import javax.swing.AbstractAction;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.KeyStroke;

@SuppressWarnings("serial")
public class Test extends JFrame{

private JPanel panel;

public Test(){
    super();
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setSize(500,500);
    setLayout(new BorderLayout());
    setVisible(true);        
    panel = new JPanel();

    // HERE ARE THE KEY BINDINGS
    panel.getInputMap().put(KeyStroke.getKeyStroke('w'),"forward");
    panel.getActionMap().put("forward", new AbstractAction(){
        @Override
        public void actionPerformed(ActionEvent e){
            System.out.println("test");
        }
    });
    // END OF KEY BINDINGS

    add(panel, BorderLayout.CENTER);
}

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

}

テキスト「テスト」は印刷されません。さまざまなバリエーション、さまざまなキーで何度も試しましたが、パネルに焦点が合っていることを確認しましたが、うまくいきませんでした。私は何を間違っていますか?

4

1 に答える 1

20

問題は、 を検索する方法ですKeyStrokeKeyStroke.getKeyStroke('w')が返されますがtyped w、これは何らかの理由でキー イベントをトリガーしません。これが、私がこの方法を避ける傾向がある理由です。代わりに使用

panel.getInputMap().put(KeyStroke.getKeyStroke("W"),"forward");

また

panel.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_W, 0),"forward");

InputMapまた、次のようなフォーカス制約を定義することもできます。

panel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW)...

より安全になります...ただし、キーストロークをトリガーするレベルを決定する必要があります

詳細についてはJComponentキーバインドの使用方法を参照してください

例で更新

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.AbstractAction;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.KeyStroke;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Test extends JFrame {

    private JPanel panel;

    public Test() {
        super();
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(500, 500);
        setLayout(new BorderLayout());
        setVisible(true);
        panel = new JPanel();

        // HERE ARE THE KEY BINDINGS
        panel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_W, 0), "forward");
        panel.getActionMap().put("forward", new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println("test");
            }
        });
        // END OF KEY BINDINGS

        add(panel, BorderLayout.CENTER);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                new Test();
            }
        });
    }
}
于 2013-08-01T03:48:10.503 に答える