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

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

而不是这个,

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

你可以…

使用ActionEvent#getSource

你可以…

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

你可以…

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

你可以…

使用Action API,它允许您定义一个公共/抽象Action ,它定义了公共属性(比如+ text),然后扩展它以对每个按钮进行独特的操作

有关详细信息,请参见如何使用操作

你可以…

使用JButton#putClientProperty在每个按钮上设置一些唯一的标志,并将ActionEvent转换为JComponent并使用getClientProperty来检索标志……但鉴于之前的建议,我不知道为什么你会打扰

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

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

虽然如果必须, 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