Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用同一java的多个按钮的Action vs ActionListener_Java_Action_Actionlistener - Fatal编程技术网

使用同一java的多个按钮的Action vs ActionListener

使用同一java的多个按钮的Action vs ActionListener,java,action,actionlistener,Java,Action,Actionlistener,我想澄清我对使用Action而不是ActionListener的理解 如果我有多个jbutton,如果单击它们,它们都需要相同的功能(例如,按钮将被禁用),那么使用Action是否更合适 如果是这样,是否因为您可以通过将操作状态设置为disabled来更改按钮的状态(例如使其处于禁用状态) 对于actionListener,这是不可能的吗 下面是演示上述示例的一些代码: JButton[] button = new JButton[10]; for(int i = 0; i < 10;

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

如果我有多个jbutton,如果单击它们,它们都需要相同的功能(例如,按钮将被禁用),那么使用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);
    }
}
JButton[]按钮=新的JButton[10];
对于(int i=0;i<10;i++){
按钮[i]=新的JButton();
动作按钮动作=新按钮动作();
按钮[i]。设置动作(按钮动作);
}
类按钮操作扩展了抽象操作{
已执行的公共无效操作(操作事件e){
setEnabled(假);
}
}
对不起,如果我把棍子的一端弄错了

谢谢大家!

根据:

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


因此,我同意您的说法,即情况就是这样。

扩展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 buttonAction = new ButtonAction(loopCounter);

在这种情况下,许多操作对象可能会很有用,而且loopCounter可能会指向标签等。

根据我的经验,更常见的情况是,您希望可以从多种类型的控件访问操作。例如,我可能有一个菜单项、一个工具栏按钮和一个右键单击上下文菜单项,它们都绑定到同一个
操作
。一个和另一个都是事件处理程序。