ActionListener和ActionEvent最佳实践查询

时间:2015-03-26 17:35:51

标签: java actionlistener actionevent

在我的代码中,我目前将所有ActionListener作为Anonymous内部类,如下所示:

item.addActionListener(new ActionListener()
    {
        public void actionPerformed(ActionEvent e)
        {
            //code here
        }
    }

现在,当代码不超过20行时,这对我来说感觉还不错,但是对于超过20行来说它感觉很笨拙。 所以,我可以实现ActionListener并有一个方法

ActionPerformed(ActionEvent ae)
{
    if ae.getSource() == item
    {
        // code here too
    }
}

但我无意在其他任何地方重复使用此代码...... 我可以创建另一个类来处理这个,但这并没有真正帮助,因为我仍然希望使用在我的父类中实例化的变量。

我真正想做的是使用这样的语法:

private void btnAction()
{
    // do code
{

public static void main(String[] args)
{
    btn.addActionListener(btnAction)
}

我觉得这样看起来最好,因为我可以隐藏底部的事件并专注于正在运行的项目的大部分内容。 这有可能实现吗?

2 个答案:

答案 0 :(得分:0)

使用Java 8,您可以这样做:

btn.addActionListener(e -> btnAction());

从这里开始阅读有关lambdas的更多信息:http://www.oracle.com/technetwork/articles/java/architect-lambdas-part1-2080972.html

答案 1 :(得分:0)

如果所有按钮都运行相同的代码,您可以定义一个(命名的)内部类来实现ActionListener并运行代码,或者您甚至可以使封闭类成为ActionListener并将其添加为动作侦听器对于所有按钮,以便其actionPerformed()运行所有按钮的代码。


另一方面,如果每个按钮需要不同的操作,您可以使用与requestod相同的方法执行不同的操作。如果您需要活动信息,我建议将活动传递给他们:

private void btnActionOK(ActionEvent e) {
    // do code
}
private void btnActionBack(ActionEvent e) {
    // do code
}
private void btnActionForward(ActionEvent e) {
    // do code
}

然后你创建了匿名类,但它actionPerformed()唯一做的就是调用适当的方法。

okButton.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        btnActionOK(e);
    }
});
backButton.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        btnActionBack(e);
    }
});
forwardButton.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        btnActionForward(e);
    }
});

内部类可以调用封闭类的方法。这样,您可以保持匿名类的简短,并且可以将所有长代码放在封闭类中的自己的方法中。