在 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());
}
}
我的项目中有两个按钮,它们都有一个“+”标签。当调用 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());
}
}