2

を持っていますAction

SampleAction a = new SampleAction("foo", null);

次に、それを Button と ActionMap に追加します

JButton b = new JButton(a);
b.getActionMap().put("bar", a);
b.getInputMap().put(KeyStroke.getKeyStroke("F1"), "bar");

System.out.println("Action [" + e.getActionCommand() + "] performed!");アクション内にトレース ( ) を入れました。マウスでボタンを押すと表示されます

Action [foo] performed!

しかし、私が使用するF1と、次のように表示されます:

Action [null] performed!

なんで?


class SampleAction extends AbstractAction
{
    public SampleAction(String text, Icon icon) {
        super(text, icon);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println("Action [" + e.getActionCommand() + "] performed!");
    }
}
4

2 に答える 2

3

私が誤解していない限り、次のようにvia wheregetActionCommandのインスタンスを呼び出す必要があります。JButtonae.getSource()getActionCommand()ActionEvent

  SampleAction a = new SampleAction("foo", null);

  JButton b = new JButton(a);
  b.getActionMap().put("bar", a);
  b.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("F1"), "bar");

class SampleAction extends AbstractAction
{
    public SampleAction(String text, Icon icon) {
    super(text, icon);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
    System.out.println("Action [" + ((JButton)e.getSource()).getActionCommand() + "] performed!");
    }
}

アップデート:

@Kleopatraのおかげで、これはより良い方法かもしれません:

SampleAction a = new SampleAction("foo", null);

JButton b = new JButton(a);
b.getActionMap().put("bar", a);
b.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("F1"), "bar");

 class SampleAction extends AbstractAction {

        public SampleAction(String text, Icon icon) {
            super(text, icon);

            putValue(Action.ACTION_COMMAND_KEY, text);//'foo' will be printed when button clicekd/F1 pressed
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            System.out.println("Action [" + e.getActionCommand() + "] performed!");
        }
    }
于 2012-12-06T10:23:37.663 に答える
1

あなたの にはアクセスできませんSampleActionが、コンストラクターで渡す「foo」テキストはテキストとして使用され、アクションコマンドとは何の関係もないと思います。

拡張元のAbstractButtonクラスを見ると、JButton

public String getActionCommand() {
    String ac = getModel().getActionCommand();
    if(ac == null) {
        ac = getText();
    }
    return ac;
}

このメソッドはActionEvent、アクションに渡される を作成するときに使用されます。ボタンをクリックすると、このメソッドが呼び出されますが、メソッドacはクラスで使用したものを返します。nullgetText()"foo"SampleAction

F1 を押してアクションを直接トリガーすると、このメカニズムがバイパスされ、単純にアクションがトリガーされます。これを回避したい場合は、 ボタンの「クリック」を実行するための API 呼び出しであるActionを の にActionMap追加できJButtonます。JButton#doClick

于 2012-12-06T10:31:16.920 に答える