【问题标题】:ActionListener and ActionEvent best practise queryActionListener 和 ActionEvent 最佳实践查询
【发布时间】:2015-03-26 17:35:50
【问题描述】:

在我的代码中,我目前将所有 ActionListener 都设置为匿名内部类,如下所示:

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

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

【问题讨论】:

  • 为什么不使用非匿名内部类?
  • 您能解释一下吗?我不熟悉非匿名内部类
  • 一个基本的inner class,有一个名字,定义为类的成员。

标签: java actionlistener actionevent


【解决方案1】:

使用 Java 8,您可以做到这一点:

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

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

【讨论】:

  • 不幸的是...我正在使用 Java 6。lambdas 确实更容易且不那么混乱,但不幸的是我没有正确的 Java 版本来使用它们:(
  • @penfold1992 Java 6 已于 2013 年 2 月结束生命周期。使用它存在相当大的安全风险,因此您最好有充分的理由使用它!
  • 嗯,我有足够的理由...我在一家拥有 50,000 多人的大公司工作,我没有任何权力说服该公司有必要更新到 Java 8 . 这正是我必须使用的 :(
【解决方案2】:

如果所有按钮都运行相同的代码,您可以定义一个(命名的)内部类来实现 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);
    }
});

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-20
    • 2013-05-10
    • 1970-01-01
    • 2021-03-31
    • 2013-10-02
    • 2013-01-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多