是否必须为我创建的每个组件创建一个单独的ActionListener?

时间:2018-07-31 20:11:10

标签: java swing

我目前正在学习java.swing和事件处理,我只用一个按钮开始简单操作,它更改了标签的文本,仅此而已。我这样做的方法是创建一个ActionListener并将其添加到按钮组件中,然后使用ActionPerformed方法更改标签的文本。我现在想知道更大的程序。您是否必须为用户可以与之交互的每个 组件创建一个新的ActionListener?必须有更好的方法来做到这一点,这是什么?

4 个答案:

答案 0 :(得分:1)

或者您为每个侦听器创建一次,但它们对lambdas表达式可能非常简洁。

或者您保留按钮的引用,并使用if / else语句与action.getSource进行比较,例如:

Button x, y; //initialized somewhere
ActionListener l = new ActionListener() {
    public void onActionPerformed(ActionEvent evt) {
        if(evt.getSource() == x) {
            //Do action for x
        } else if (evt.getSource() == y) {
            //Do action for y
        }
}
x.addActionListener(l);
y.addActionListener(l);

答案 1 :(得分:0)

由于两个组件的功能完全相同是非常不寻常的,因此很可能每个组件都需要一个自己的ActionListener。

如果出于某种原因,两个组件执行相同的操作,那么我想到的最简单的方法就是将代码外包给一个方法,然后从ActionListener中调用该方法

答案 2 :(得分:0)

您可以...

制作一个专门的类来执行常见的操作,可以通过将参数传递给构造函数来进行配置

您可以...

使用Anonymous Classes

您可以...

利用Actions API并创建小的可重用操作。

这类似于第一点,但是提供了更多可配置的工作单元,可以轻松地应用于菜单项,按钮和键绑定

ActionEvent ...

ActionEvent包含许多使用属性,actionCommand可能是较常见的一种(至少在匿名类出现之前)。

这使您可以将事件的源与应执行的操作分离开来,从而可以在多个对象上重复使用ActionListener(或同一个实例)。

话虽这么说,Action API已经或多或少地使其具有冗余性

总体...

目的是将重点放在核心操作上,并设计可重用和/或可配置的类,这些类可以很容易地提取出来,或者可以帮助减少通用代码的整体重复和重复。

答案 3 :(得分:-1)

我认为无法在同一个动作侦听器中处理多个按钮。 但是每次您单击按钮时,都可以在同一actionListener中处理整个文本框。 此外,在同一个actionListener中处理多个按钮听起来并不简单