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