2012-11-06 24 views
3

多个按钮,我想澄清我用行动代替的ActionListener的理解。行动VS的ActionListener与同一个Java

如果我有多个Jbutton将所有需要相同的功能,如果他们点击(例如按钮将被禁用)发生,就用行动更适合呢?

如果是这样,是不是因为你可以通过设置操作禁用状态更改按钮的状态(例如使它禁用)?

这是不可能的一个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

根据我的经验,一个比较常见的情况是,当你想要一个动作是从多个访问_types_的控件。例如,我可能有一个菜单项,一个工具栏按钮和一个右键单击的上下文菜单项,它们都绑定到同一个“操作”上。 –

+0

一个和另一个是事件处理程序。 –

回答

5

按照Javadoc

行动接口提供了一个有用的扩展,以便ActionListener接口,其中相同的功能可以由若干控件访问。

所以我同意你的看法,即情况如此。

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

然后,同样的信息会自动出现在任何按钮,菜单项等

在您的例子中的一句话: 通常你不希望创建许多操作,如

Action buttonAction = new ButtonAction(); 
在循环

。你通常会有一个Action对象,并在所有的MenuItems,按钮重用等 一个典型的例外是,如果你的动作变化对传入构造参数的行为。

Action buttonAction = new ButtonAction(loopCounter); 

在这种情况下,许多操作对象可能是有用的 - 也是循环计数器可能会去的标签等