2012-12-06 19 views
2

我有一个Action行动和ActionMap中 - 解释我这种行为

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

然后我把它添加到一个按钮,并以关系的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!"); 
    } 
} 
+0

我们可以看到'SimpleAction'类的ActionMap,张贴一个[SSCCE](http://sscce.org) –

+1

@DavidKroukamp在那里你去 – Fabricio

+0

为什么问题很难回答(无法看到摆动团队开发者的大脑,甚至不存在,远远少于过去:-)如果某个Action没有明确设置其actionCommand,则默认为SomeThing。 SomeThing在创建actionEvent的两个位置(在AbstractButton.fireActionEvent vs SwingUtilities.notifyAction中)不同。 – kleopatra

回答

3

除非我误解你应该通过ae.getSource()JButton的实例调用getActionCommand这里因为你是在ActionEvent调用getActionCommand()

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!"); 
    } 
} 

UPDATE:

感谢@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!"); 
     } 
    } 
+0

嗯...这不是真的回答这个问题(正如我认为的那样,无论如何:-) - 当使用相同的动作作为按钮(在点击时执行)时使用的_actionCommand_与使用actionMap。 – kleopatra

+0

我把'JComponent。WHEN_IN_FOCUSED_WINDOW',但当按下F1时它仍然打印出'null' – Fabricio

+0

@Fabricio请参阅更新 –

1

我有你没有SampleAction访问,但我猜你在构造函数中通过“foo”的文本作为文本和具有无关的动作命令。

如果你看看AbstractButton类从JButton延伸,你看

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

产生被传递到操作的ActionEvent当使用这种方法。当您单击该按钮时,将调用此方法,并且我假设acnull,但getText()方法返回您在SampleAction类中使用的"foo"

当您通过按F1直接触发操作时,可以绕过此机制并简单地触发操作。如果你想避免这种情况,你可以添加一个ActionJButton简单地做JButton#doClick,这是API呼叫来执行“点击”按钮

+0

哦,所以这并不重要。我只是认为我在键盘绑定方面做了一些错误。 :) – Fabricio

+1

“然而...”有点误导:没有任何旁路,只是在不同位置创建的ActionEvent,请参阅SwingUtilities.notifyAction :)默认值只是...默认值,并且不可控制(甚至在这里甚至是无证的)。如果我们需要控制它们,唯一的出路是用它配置动作。 – kleopatra

相关问题