我在java类中有一个函数,它触发一个动作监听器(如下所示):
// action event fired when hitting a checkbox
public void fireActionCheckBox(MyMainClass frame, JCheckBox theButtonExample) {
for(ActionListener a: theButtonExample.getActionListeners()) {
a.actionPerformed(new ActionEvent(this, ActionEvent.ACTION_PERFORMED, null) {
//Nothing need go here, the actionPerformed method (with the
//above arguments) will trigger the respective listener
});
}
}
然后我有第二个函数对JButton的动作监听器做同样的事情:
// action event fired when hitting a button
public void fireActionButton(MyMainClass frame, JButton theButtonExample) {
for(ActionListener a: theButtonExample.getActionListeners()) {
a.actionPerformed(new ActionEvent(this, ActionEvent.ACTION_PERFORMED, null) {
//Nothing need go here, the actionPerformed method (with the
//above arguments) will trigger the respective listener
});
}
}
我理解在java中必须在开始之前分配参数,但是编写两次相同的代码似乎效率低下。有没有更好的方法来做到这一点,他们会允许我不要为一个非常相似的动作编写两个函数。
感谢您的帮助!
答案 0 :(得分:3)
public void fireActionCheckBox(MyMainClass frame, AbstractButton button) { ... }
有一个抽象类AbstractButton
,它是这两个类的父类。它定义了getActionListeners
方法。
此外,您可以以更通用的方式重写该方法:
public <T extends AbstractButton> void fireActionButton(MyMainClass frame, T button) { ... }
答案 1 :(得分:2)
您可以传递方法泛型参数,而不是JCheckBox theButtonExample
和JButton theButtonExample
。例如,假设两个类都扩展了相同的父级,您可以执行
public <J extends commonParent> void fireActionButton(MyMainClass frame, J j) {
//...
}
由于@Sweeper在评论中指出,由于父母没有听众,您需要检查类型并执行向下转换:
public <J extends JComponent> void fireActionButton(MyMainClass frame, J j) {
if (j instanceof JComboBox) {
JCheckbox jbox = (JComboBox)j;
// Do something else
}
}
答案 2 :(得分:1)