1

キーバインドの背後にある基本的な概念を学ぼうとしているだけで、非常に基本的なコーディングを行っています。すべてが非常に簡単に思えますが、ロジックまたは構造に何か問題があり、コードが思いどおりに実行されていません。

これが私のコードです

public class Board {

ButtonListener buttonlistener;  
EnterAction enterAction;

public Board(){

    JFrame skeleton = new JFrame();
    skeleton.setDefaultCloseOperation(EXIT_ON_CLOSE);
    skeleton.setVisible(true);
    skeleton.setSize(400, 400);

    buttonlistener = new ButtonListener();
    enterAction = new EnterAction();

    JPanel panel = new JPanel();
    panel.setBackground(Color.BLACK);

    JButton button = new JButton("button");
    button.addActionListener(buttonlistener);
    panel.add(button);
    skeleton.add(panel);        
    panel.getInputMap().put(KeyStroke.getKeyStroke("s"), "doEnterAction");
    panel.getActionMap().put("doEnterAction", enterAction);

}

public class ButtonListener implements ActionListener{
    @Override
    public void actionPerformed(ActionEvent arg0) {     
        System.out.println("button pressed");
    }       
}

public class EnterAction extends AbstractAction{
    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println("enter pressed");    
    }       
}

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

したがって、それはかなり単純なはずです。ご覧のとおり、Enter キーを押すたびに「Enter キーを押しました」と出力しようとしていますが、何も出力されません (上のコードに示されているボタンをクリックしない限り)。また、Eclipse では、EnterAction クラスに黄色の下線が引かれています。正しく呼び出されていない可能性があると思いますが、そうでない理由はわかりません。

どんな助けでも大歓迎です、ありがとう。

4

3 に答える 3

4

変化する

panel.getInputMap().put(KeyStroke.getKeyStroke("s"), "doEnterAction");

panel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("S"), "doEnterAction");

また

skeleton.setDefaultCloseOperation(EXIT_ON_CLOSE);

パラメータはJFrame.EXIT_ON_CLOSEnumber であるか、単に入力する必要があります3

于 2013-07-30T01:17:11.203 に答える
3

私が見ることができる当面の問題は、次のステートメントにあります

panel.getInputMap().put(KeyStroke.getKeyStroke("s"), "doEnterAction");

KeyStroke.getKeyStroke("s")戻る予定nullです。このメソッドに渡されるの要件Stringは非常に特殊であり、十分に文書化されていません (IMHO)。

KeyStroke.getKeyStroke("S")代わりに を使用することもできますがKeyStroke.getKeyStroke(KeyEvent.VK_S, 0)、文が曖昧になる可能性がないため、使用することを好みます。

また、入力マップに対してもフォーカス境界を定義することをお勧めします...

の代わりに、 を使用して、ウィンドウにフォーカスがある場合にキー イベントが確実にトリガーされるようにしてpanel.getInputMap()ください。panel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW)

詳細については、JComponent#getInputMapをご覧ください。

まだ行っていない場合は、How to use Key Bindingsも参照してください。

于 2013-07-30T01:16:44.760 に答える
2

Azad と MadProgrammer は正しいと思います。プログラムを実行するために、彼らが推奨するものに加えて、もう 1 つ簡単な変更を加えるだけで済みました。コード内のコメントとして 3 つの項目に番号を付けました: (コピーして貼り付ければ完了です)。

import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.KeyStroke;

public class Board {

    ButtonListener buttonlistener;
    EnterAction enterAction;

    public Board() {

        JFrame skeleton = new JFrame();
        //Change #1 below 
        skeleton.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        skeleton.setVisible(true);
        skeleton.setSize(400, 400);

        buttonlistener = new ButtonListener();
        enterAction = new EnterAction();

        JPanel panel = new JPanel();
        panel.setBackground(Color.BLACK);

        JButton button = new JButton("button");
        button.addActionListener(buttonlistener);
        panel.add(button);
        skeleton.add(panel);
        //Change #2 below
        panel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(
                KeyStroke.getKeyStroke("S"), "doEnterAction");
        panel.getActionMap().put("doEnterAction", (Action) enterAction);

    }

    public class ButtonListener implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent arg0) {
            System.out.println("button pressed");
        }
    }

    public class EnterAction extends AbstractAction {
        @Override
        public void actionPerformed(ActionEvent e) {
            System.out.println("enter pressed");
        }
    }

    public static void main(String[] args) {
        new Board();
    }
    //Change #3 below
}

スクリーンショットは次のとおりです。 ここに画像の説明を入力

于 2013-07-30T01:45:14.290 に答える