Action vs ActionListener用于具有相同java的多个按钮

时间:2012-11-06 21:17:55

标签: java action actionlistener

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

如果我有多个JButton,如果点击它们都需要相同的功能(例如按钮将被禁用),那么使用Action会更合适吗?

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

使用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);
    }
}

很抱歉,如果我的错误结束了!

谢谢!

2 个答案:

答案 0 :(得分:5)

根据Javadoc

  

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

所以我同意你的断言,就是这种情况。

答案 1 :(得分: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也可能会转到标签等。