如何使用动作监听器

4

我是Swing的新手,需要一些关于动作监听器的帮助。我看到它们被用在这个例子里:

button.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        // Do something
    }
});

然而,我希望实现更像这样的功能:
button.addActionListener(myFunc);

public void myFunc(ActionEvent e) 
{
   // Do something
}

这个有可能吗?

我对Swing不熟悉,需要一些关于动作监听器的帮助。注意,动作监听器是AWT而不是Swing。 ;) - Andrew Thompson
5个回答

7
这里有两种可能的方法 - 你可以直接从第一个例子中调用你的myFunc方法:
button.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        myFunc(e);
    }
});

或者您可以定义一个实现actionlistener的内部类,然后使用它:

class MyActionListener implements ActionListener {
    public void actionPerformed(ActionEvent e) { 
        //Your code
    }
}

button.addActionListener(new MyActionListener());

未来的 Java 8(预计在2013年发布)将支持使用闭包更简洁地完成此操作。


@Thufir 不确定你所说的“不能真正使用泛型”是什么意思 - Swing 中有几种情况确实使用了泛型,如果闭包没有以类似的方式进行改装,我会感到非常惊讶。 - Michael Berry

4
如果你想避免使用额外的类,可以使用一个反射式的弹跳类。我已经为此编写了一个实用类:

http://softsmithy.sourceforge.net/lib/docs/api/org/softsmithy/lib/swing/action/ReflectiveXAction.html

关于反射操作的更多信息,请参阅Steve Wilson和Jeff Kesselman所著的《Java平台性能策略与战术》中第6.2.3章,第73页的内容(链接)

教程:

http://softsmithy.sourceforge.net/lib/docs/tutorial/swing/action/index.html

Maven:

<dependency>  
    <groupId>org.softsmithy.lib</groupId>  
    <artifactId>lib-core</artifactId>  
    <version>0.1</version>  
</dependency>  

下载:

http://sourceforge.net/projects/softsmithy/files/softsmithy/v0.1/


3
很简单:
button.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        myFunc(e);
    }
});


public void myFunc(ActionEvent e) 
{
   // Do something
}

我知道这有点老套...但是Java不支持将函数作为参数传递。


3

只有当该方法返回一个 ActionListener 时才可能实现,否则不行。当然,将 ActionEvent 的处理委托给一个单独的方法是完全有效的。


1
如果您想使用Java 8lambda表达式,请按如下操作。
button.addActionListener(ae -> myFunc(ae));

作为其他答案的替代方案,对于较低版本的Java,您可以使用匿名类。
    ActionListener myFunc = new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            //code
        }
    };

    button.addActionListener(myFunc);

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