ActionListener和ActionEvent最佳做法查询

问题描述 投票:0回答:2

在我的代码中,我目前将所有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)
}

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

java actionlistener actionevent
2个回答
0
投票

使用Java 8,您可以执行以下操作:

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

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


0
投票

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


另一方面,如果每个按钮需要不同的操作,则可以像请求方法一样将不同的操作作为方法。 我建议您将事件传递给他们,以防您需要事件信息:

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);
    }
});

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

© www.soinside.com 2019 - 2024. All rights reserved.