如何在 Java Swing 中对单击执行多个操作

How to Perform Multiple Action on Single Click in Java Swing

我有一个关于通过单击 button 执行其他 buttons 操作的问题。三个按钮的一些示例代码:

JButton a = new JButton("a");
a.addActionListener(new ActionListener() {
  public void actionPerformed(ActionEvent e) {
    // Action of a is Here                   
  }
});

JButton b = new JButton("b");
b.addActionListener(new ActionListener() {
  public void actionPerformed(ActionEvent e) {
    // Action of b is Here                   
  }
});

那些应该放在一起,比如:

JButton c = new JButton("c");
c.addActionListener(new ActionListener() {
  public void actionPerformed(ActionEvent e) {
    // Action of c is Here
    // Action of a 
    // Action of b              
   }
});

在上面的示例中,我有三个按钮 a,b,c,每个按钮都有自己的操作;但如您所见,C 还必须 运行 A 和 B 的操作。解决此问题的好方法是什么?

无论您想在 Button 上做什么,单击 a,您都可以放入一个方法并从任何地方调用它。

public void methodForA(){
   // do here what you want
}

您现在可以在您希望它从中调用的方法中调用它。在您的情况下,从按钮单击 A 和按钮单击 C

JButton a = new JButton("a");
a.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        methodForA();
    }
 });

// and also in your c-Button
JButton c = new JButton("c");
c.addActionListener(new ActionListener() {
   public void actionPerformed(ActionEvent e) {
          // Action of c is Here
          methodForA(); 
   }
});

独立于 actionListeners 操作 Perform 方法为每个按钮创建 3 个方法,并从 actionPerfomed 方法调用它们:

private void btnAClicked(){};
private void btnBClicked(){};
private void btnCClicked(){};


JButton c = new JButton("c");
    c.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
           btnCClicked();
           btnAClicked(); 
           btnBClicked();              

        }
    });

1) 方法

为每个操作使用方法并在 ActionListener.actionPerformed

中调用它们
public void methodA(){}
public void methodB(){
    methodA();
}

2) 动作实例

您可以创建自己的 类 个 ActionListener 来执行这些操作

第一次行动:

class ActionA implements ActionListener{
     public void actionPerformed(ActionEvent e) {
          ...
    }
}

一个改进的动作

class ActionB extends ActionA{
    public void actionPerformed(ActionEvent e) {
           super.actionPerformed(e);  //Will call the first action
           ...
    }
}

这是有限的,因为你不能有多个扩展,但也是一个很好的解决方案

3) 点击

最后但我不喜欢,使用AbstractButton.doClick动态点击其他按钮。

4) 添加多个动作

请注意,这些方法不是 setActionListener 而是 addActionListener,这意味着它将接受多个 ActionListener。

所以定义创建两个实例

ActionListener listenerA = new ActionLisener ..
ActionListener listenerB = new ActionLisener ..

buttonA.addActionListener(listenerA);

buttonB.addActionListener(listenerB);

buttonC.addActionListener(listenerA);
buttonC.addActionListener(listenerB);

通过一个小测试,我注意到动作是按照 B -> A 的顺序执行的(可能不具有普遍性)。

正如评论中所说,这应该是我们知道的风险,这将。如果一个动作因为异常而失败,是否应该执行下一个动作?默认情况下不会,因为进程不会隐藏异常。

我会将此解决方案限制为 GUI 管理,例如重置字段、禁用...可用于不同的按钮。

其他答案都是正确的,但这里缺少一个重要方面:小心 AWT event dispatcher thread.

上的 dong "too many things"

含义:单击按钮时,将创建一个 事件 ,并且 UI 框架使用该特殊线程来触发已注册的侦听器。如果其中一个侦听器现在决定进行密集计算……UI 事件线程会一直忙于执行 "that"。在做 "that thing" 的同时;此线程不可用于调度任何 other UI 事件。

因此,这是 "not only" 关于创建 methodA()、methodB()、methodC() 并在您的第三个动作侦听器中调用它们的内容。这也是关于理解 if 组合多个调用受制于 "I should better run those things in a separate thread; to not block the event dispatcher thread"。

从这个意义上说:其他答案告诉您从这里去哪里;但请务必小心您的 "joined actions" 按钮即将创建的 "amount of activity"!