我的项目中有两个按钮都有一个“”标签。当调用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);
}
}
而不是这个,
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());
}
}
您不应该让一个侦听器处理不同职责的行为。如果两个< 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。
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中的方法是默认的,您也无法实现它们两者。因此,这也是一个编译时错误: