在 Java 中使用多个具有相同标签的 JButton

Using multiple JButtons with the same label in Java

我的项目中有两个按钮,它们都有一个“+”标签。当调用 actionPerformed() 方法时,它会根据标签调用特定的方法。如何区分具有相同标签的两个 JButton?有比我做的更好的方法吗?

这是按钮的定义:

JButton keypadPlus1 = new JButton(" + ");
JButton keypadMinus1 = new JButton(" - ");
JButton keypadPlus2 = new JButton("+");
JButton keypadMinus2 = new JButton("-");

为按钮添加 ActionListeners:

keypadPlus1.addActionListener(backEnd);
keypadPlus2.addActionListener(backEnd);
keypadMinus1.addActionListener(backEnd);
keypadMinus2.addActionListener(backEnd);

后台执行@Override的actionEnd:

public void actionPerformed (ActionEvent event) {
        String command = event.getActionCommand();
        if (command.equals("+")) {
            calcLifePoints(command);
        }
        if (command.equals("-")) {
            calcLifePoints(command);
        }
        if (command.equals(" + ")) {
            calcLifePoints(command);
        }
        if (command.equals(" - ")) {
            calcLifePoints(command);
        }

    }

你可以...

使用ActionEvent#getSource

你可以...

将每个按钮的 actionCommand 属性 设置为唯一的东西并使用 ActionEvent#getActionCommand

你可以...

根据您的需要使用单独的侦听器,匿名或内部或外部类

你可以...

利用 Action API,这将允许您定义一个 common/abstract Action,它定义了公共属性(如 +文本),然后扩展它以对每个按钮进行独特的操作

有关详细信息,请参阅 How to Use Actions

你可以...

使用 JButton#putClientProperty 在每个按钮上设置一些独特的标志并将 ActionEvent 转换为 JComponent 并使用 getClientProperty 检索标志...但是给出之前的建议,我不知道你为什么要打扰

您不应该让一个侦听器处理不同职责的行为。如果两个 + 按钮不做同样的事情,给按钮单独的监听器。

这将使您的代码更具凝聚力。通过将每个听众减少 1 项责任,您将能够重用这些责任。它还使测试更容易,允许您完全隔离地测试每个行为。

尽管如果必须,ActionEvent#getSource() returns 哪个组件触发了事件。进行 参考比较 将允许您确定哪个对象触发了事件。


处理此问题的最佳方法是将当前侦听器的职责分离到单独的 classes:

class FirstListener implements ActionListener {
    @Override
    public void actionPerformed(ActionEvent e) {

    }
}

让我们假设 FirstListener 代表您的第一个 + 按钮行为。如果该行为需要任何外部对象(例如不同 class 中的字段),只需将其传递给构造函数即可:

class FirstListener implements ActionListener {
    private Object dependency;

    public FirstListener(Object dependency) {
         this.dependency = dependency;
    }

    //actionPerformed declaration
}

您可以对其他按钮执行相同的操作(例如,第二个 + 按钮)。

如果您觉得这有点过分,请随意使用 lambda 表达式来声明侦听器:

//Java 8+
button.addActionListener(event -> {

});

这不会为您提供与前面示例相同的模块化,因为行为不再与实际分离class:您将被迫更改实现以更改行为,而不是使用依赖倒置来简单地传递一个不同的对象,它也实现了 ActionListener.

而不是这个,

public void actionPerformed (ActionEvent event) {
        String command = event.getActionCommand();
        if (command.equals("+")) {
            calcLifePoints(command);
        }
        if (command.equals("-")) {
            calcLifePoints(command);
        }
        if (command.equals(" + ")) {
            calcLifePoints(command);
        }
        if (command.equals(" - ")) {
            calcLifePoints(command);
        }

    }

这样使用,

public void actionPerformed (ActionEvent event) {
        Object command = event.getSource();
        if (command.equals(keypadPlus1)) {
            calcLifePoints(event.getActionCommand());
        }
        if (command.equals(keypadMinus1)) {
            calcLifePoints(event.getActionCommand());
        }
        if (command.equals(keypadPlus2)) {
            calcLifePoints(event.getActionCommand());
        }
        if (command.equals(keypadMinus2)) {
            calcLifePoints(event.getActionCommand());
        }

    }