如何在Java Swing中为多个按钮添加多个ActionListeners

10

我知道如何创建一个按钮和一个Action Listener,但我想要有多个按钮和它们的 ActionListeners 分别执行不相关的操作。

例如:

protected JButton x;

x = new JButton("add");
x.addActionListener(this);

public void actionPerformed(ActionEvent evt) { //code.....}

现在我想要其他不同功能的按钮,比如减法、乘法等,请给予建议。谢谢。


不要使用ActionListener,而是使用Action:通常的规则是始终选择可用的最高抽象层。 - kleopatra
6个回答

20

那这样怎么样:

    JButton addButton = new JButton( new AbstractAction("add") {
        @Override
        public void actionPerformed( ActionEvent e ) {
            // add Action
        }
    });

    JButton substractButton = new JButton( new AbstractAction("substract") { 
        @Override
        public void actionPerformed( ActionEvent e ) {
            // substract Action
        }
    });

+1给所有答案。@oliholz很好的使用Actions的例子。 - Boro
非常感谢。我过去几天一直在寻找这个,但找不到。 - JavaBits
这段代码在JButton(new AbstractAction(){})处报错,提示方法未定义。 - Frasher Gray
1
@FrasherGray 请提供完整的错误行和您的Java版本。您是否使用了 import javax.swing.JButton;import javax.swing.AbstractAction - oliholz

11

使用内部类:

x = new JButton("add"); 
x.addActionListener(
  new ActionListener() {
    public void actionPerformed(ActionEvent e) {
      //your code here
    }
  }
);

7

如何处理...

protected JButton x, z, a, b,c;

x = new JButton("add x");
z = new JButton("add z");
a = new JButton("add a");
b = new JButton("add b");
c = new JButton("add c");
x.addActionListener(this);
z.addActionListener(this);
a.addActionListener(this);
b.addActionListener(this);
c.addActionListener(this);

那么

public void actionPerformed(ActionEvent evt)
{
     if (evt.getSource()==x)
         {
            //do something
         }
     else if (evt.getSource()==z)
         {
            //do something
         }
     else if (evt.getSource()==a)
         {
            //do something
         }
     else if (evt.getSource()==b)
         {
            //do something
         }
     else if (evt.getSource()==c)
         {
            //do something
         }
}

这对我总是有效,但老实说我不确定它是否是一种不好的做法。


1
evt.getSource() 对我不起作用,但 evt.getActionCommand() 起作用了。 - Jay Brown

6

您可以使用 ActionEvent.getSource() 来确定来源并相应地采取行动,或者您可以为每个来源定义不同的 ActionListeners


1

每次只需要创建ActionListener的新实例即可。顺便说一下,出于许多原因,建议使用Action

这里有一个很好的资源,它还解释了为什么你应该使用Actions而不是ActionListeners,一个名为How to Use Actions的Java教程。

编辑:@fmucar是正确的,你可以在单个ActionListener中完成所有操作。但是,拥有单独的功能Actions允许您独立地重用它们。


1
你可以创建不使用你的类的不同动作监听器实例:
x.addActionListener(new ActionListener(){
    @Override
    public void actionPerformed(ActionEvent e)
    { ... }
});

有几种其他方法可以创建动作监听器,就像任何类一样,但对于短动作而言,这(匿名类)是一种方便的方式。


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