3

我想澄清一下我对使用 Action 而不是 ActionListener 的理解。

如果我有多个 JButton,如果单击它们,它们都需要发生相同的功能(例如按钮将被禁用),那么使用 Action 是否更适合于此?

如果是这样,是不是因为您可以通过将 Action 的状态设置为禁用来更改按钮的状态(例如使其禁用)?

使用 actionListener 是不可能的吗?

下面是一些演示上面给出的示例的代码:

JButton[] button = new JButton[10];

for(int i = 0; i < 10; i++){
    button[i] = new JButton();
    Action buttonAction = new ButtonAction();
    button[i].setAction(buttonAction);  
}

class ButtonAction extends AbstractAction{
    public void actionPerformed(ActionEvent e){
        setEnabled(false);
    }
}

对不起,如果我弄错了棒子的一端!

谢谢!

4

2 回答 2

5

根据Javadoc

在多个控件可以访问相同功能的情况下,Action 接口为 ActionListener 接口提供了有用的扩展。

所以我同意你的说法,就是这种情况。

于 2012-11-06T21:20:44.580 回答
3

扩展 AbstractAction 使您能够以相同的方式在代码中的某一点添加其他信息:

public class NewFileAction extends AbstractAction
{
 /**
   * 
   */
protected NewFileAction()
{
  super("NewFile");
  this.putValue(NAME, "New File");
  this.putValue(SHORT_DESCRIPTION, "New file");
  this.putValue(LONG_DESCRIPTION, "New file");
  this.putValue(SMALL_ICON,ImageIconFactory.getSmallImageIcon(ImageIconFactory.Option.SUN_New24));
}

然后,相同的信息将自动出现在任何按钮、MenuItem 等上。

对您的示例的评论:通常您不想创建很多动作,例如

Action buttonAction = new ButtonAction();

在你的循环中。您通常会拥有一个 Action 对象并在所有 MenuItems、Buttons 等中重用它。一个典型的例外是您的操作的行为在构造函数中传递的参数上发生变化。

Action buttonAction = new ButtonAction(loopCounter);

在这种情况下,许多操作对象可能很有用 - loopCounter 也可能会转到标签等。

于 2012-11-06T21:46:30.253 回答