当前位置: 首页 > 知识库问答 >
问题:

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

禹智渊
2023-03-14

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

这是按钮的定义:

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后端:

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个答案

戴嘉珍
2023-03-14

而不是这个,

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

    }
茹轩昂
2023-03-14

您不应该让一个侦听器处理不同职责的行为。如果两个< code> 按钮不做相同的事情,请为这两个按钮提供单独的侦听器。

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

但是如果必须的话,< code > action event # 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 -> {

});

这并没有给你与前一个例子相同的模块化,因为行为不再与实际的类分离:你将被迫改变实现来改变行为,而不是使用依赖反转来简单地传递一个不同的对象,该对象也实现< code>ActionListener。

南宫松
2023-03-14

Use ActionEvent#getSource

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

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

使用操作API,该API允许您定义一个公共/抽象的动作,该动作定义了公共属性(如text),然后对其进行扩展,为每个按钮创建唯一的动作

有关更多详细信息,请参阅如何使用操作

使用JButton#putClientProperty在每个按钮上设置一些唯一的标志,并将ActionEvent转换为JComponent并使用getClientProperty检索标志...但是考虑到之前的建议,我不知道你为什么要费心

 类似资料:
  • 问题内容: 我遇到一个问题,当执行两个表的联接时,无法确定mysql查找具有两个特定“标签”和相同“ hashid”的链接 假设我的表看起来像这样: 链接 标签 我想返回同时具有“有用”和“很棒”标签的行 当前(工作/快速)查询,用于按1个标签查找链接: 阅读文章后,我尝试使用以下内容: 这 不 工作,但它是如此令人难以置信的缓慢,因为无法使用。 有人知道解决方案吗? 问题答案: 问题的类型称为

  • 问题内容: 给定上面的xml文件,我将如何检索标签内所有标签的列表?我想获取“名称”的所有值以及标签之间的数字值。像这样: 问题是我不知道会有多少个附加标签。可能没有,也可能有20。我需要某种方法来对它们全部进行计数,然后删除信息。 问题答案: 这是一个使用JDK执行查询的示例。它假定变量包含您的XML文档。

  • 我有一个场景,其中有两个具有相同方法名称的不同标记。但它在Swagger编辑器中抛出了一个语法错误,称为“重复的映射键”。 在OpenAPI中编写此内容的正确方法是什么?

  • 我正在使用java。util。ServiceLoader创建轻量级插件框架。 我目前正在努力解决如何拥有多个具有相同FQN的实现类。我想在类路径上拥有同一个插件的两个副本,并且可以访问META-INF/services目录中给出的两个实现类。 以下是一些简单的eclipse项目,它们说明了我的意思:https://docs.google.com/open?id=0B4MxFm-ACB3IUmswN

  • 我今天面试了,我的面试官问我如何在HashMap中存储具有相同键的多个值?她给了我这个例子—— 我在如何使用HashMap时给了她以下解决方案: 整数是字符串的长度,ArrayList将存储该特定长度的字符串。 面试官说这是使用HashMap的一种方式,但还有另一种方式我不需要ArrayList或任何其他数据结构。在面试期间,我无法想出任何解决方案,现在在谷歌搜索了足够多之后,我仍然一无所获。有人

  • 问题内容: 假设我有两个接口: 如果我想同时实现它们,那么将使用哪种实现? 问题答案: 这是一个编译时错误。您不能从两个接口获得两个实现。 但是,如果在中实现该方法,则是正确的: 我只想补充一点,即使I1中的方法是抽象的,而I2中的方法是默认的,您也无法实现它们两者。因此,这也是一个编译时错误: