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

时间:2016-03-09 00:39:39

标签: java swing jbutton actionlistener

我的项目中有两个按钮都带有“+”标签。调用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);

backEnd中的actionPerformed @Override:

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

    }

3 个答案:

答案 0 :(得分:2)

你可以......

使用ActionEvent#getSource

你可以......

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

你可以......

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

你可以......

使用Action API,这将允许您定义一个公共/抽象Action,它定义了公共属性(如+文本),然后将其扩展为make每个按钮的独特操作

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

你可以......

使用JButton#putClientProperty在每个按钮上设置一些唯一标记,然后将ActionEvent转换为JComponent并使用getClientProperty检索标记...但是给出了之前的标记建议,我不确定你为什么要打扰

答案 1 :(得分:2)

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

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

虽然如果必须,ActionEvent#getSource()会返回哪个组件触发了事件。执行参考比较将允许您确定触发事件的对象。

处理此问题的最佳方法是将当前监听器的职责分为不同的类:

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

    }
}

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

class FirstListener implements ActionListener {
    private Object dependency;

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

    //actionPerformed declaration
}

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

如果你觉得这有点过分,可以随意使用lambda表达式声明听众:

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

});

这并没有提供与前一个示例相同的模块性,因为行为不再与实际类分开:您将被迫更改实现以更改行为,而不是使用依赖项反转只需传递一个同样实现ActionListener的对象。

答案 2 :(得分:0)

而不是这个,

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

    }