一个ActionListener适用于多个JButton

5
我想为一组按钮添加ActionListener。是否有一个类可以包装这些按钮?类似于GroupJButtons或更普遍的对象组?这样我就可以为它们设置一个ActionListener。最后,我并不关心哪个按钮被按下,我只想改变他的文本,所以我只需将其强制转换为JButton并更改文本即可。
整个过程可以减少1到2行代码(如果使用循环),但我想这样做因为从逻辑上讲更好。

2
这是一个非常不寻常的 GUI,有许多按钮做*完全相同的事情。使用案例是什么? - Andrew Thompson
2个回答

7
在这种情况下,您可以扩展AbstractAction类,并将相同的操作应用于多个按钮。
  class MyAction extends AbstractAction {
       public MyAction(String text, ImageIcon icon,
                  String desc, Integer mnemonic) {
       super(text, icon);
       putValue(SHORT_DESCRIPTION, desc);
        putValue(MNEMONIC_KEY, mnemonic);
   }
   public void actionPerformed(ActionEvent e) {
        //do the action of the button here
    }
  }

然后,对于你希望发生相同事件的每个按钮,你可以:

 Action myAction = new MyAction("button Text", anImage, "Tooltip Text", KeyEvent.VK_A);
 button = new JButton(myAction);

非常好的解决方案!但是对于一组按钮来说,它不会有点过度设计了吗? - user1103589
2
@Arno:我觉得这不会过度。赞一个好答案。如果所有按钮都具有相同的文本和操作,则可以创建一个MyAction对象并使用它来创建多个按钮。现在,如果按钮具有不同的标题,则可能需要创建一个ActionListener,然后将其添加到多个按钮中。 - Hovercraft Full Of Eels
@HovercraftFullOfEels,是的,我的解决方案展示了处理具有不同标题的按钮的方法。 - Nikolay Kuznetsov
在上述示例中,如果您想要不同的文本和图像以供每个按钮使用,则可以创建具有不同参数的MyAction不同实例。您可以修改构造函数以适应自己的需求。 - Vincent Ramdhanie

4
您可以使用此功能创建每个按钮。
private JButton createButton(String title, ActionListener al) {
    JButton button = new JButton(title);
    button.addActionListener(al);
    return button;
}

这是处理操作的步骤:

public void actionPerformed (ActionEvent ae) {
    JButton button = (JButton)ae.getSource();
    button.setText("Wherever you want");
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接