我对Java很新,所以可能会以完全错误的方式解决这个问题。是否存在实现addActionLister
方法的对象的接口,这样我可以使用这样的测试来查明是否可以向其添加ActionListener。
if (someObject instanceof WhatShouldThisBe){
someObject.addActionListener(...);
}
我已经尝试了各种各样的东西,但是找不到有效的方法或者找出如何搜索文档的方法(javadoc)。
我试图通过迭代来同时向表单中的所有组件添加动作侦听器,myForm.getComponents()
问题是,它提供了一个Component对象数组,而Component类没有&#39 ; t有一个addActionListener方法(至少,根据我的IDE,无论如何)。
提前感谢您的帮助。
答案 0 :(得分:1)
根据JButton
的Javadoc,addActionListener
方法在抽象超类AbstractButton
中声明。它不是interface
,但它可以满足您的需求。如果你写
if (someObject instanceof AbstractButton)
然后您将选择JButton
,JMenuItem
或JToggleButton
。
答案 1 :(得分:0)
如果您的计划中有JComponents
个对象,而JButton
,JMenuItem
和JToggleButton
点不
AbstractButton
- 示例 JComboBox
- 您可以考虑使用 Reflection
。
这个想法是保留两个单独的集合,一个用于approvedClasses
,另一个用于declinedClasses
,其中不包含此类方法签名。
这样可以节省一些时间,因为搜索给定方法签名的方法应该搜索给定类组件的层次结构树中的所有类。
因为你有一个包含很多组件的表单,所以时间至关重要。
import java.lang.reflect.Method;
import java.util.HashSet;
import java.util.Set;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JList;
import javax.swing.JMenuItem;
public class SearchForAddActionListener{
// to save time, instead of searching in already-searched-class
static Set<Class<?>> approvedClasses = new HashSet<>();
static Set<Class<?>> declinedClasses = new HashSet<>();
public static boolean hasAddActionListener(JComponent component, String signature){
Class<?> componentClazz = component.getClass();
Class<?> clazz = componentClazz;
if(declinedClasses.contains(componentClazz)){return false;}
while(clazz!=null){
if(approvedClasses.contains(clazz)){
approvedClasses.add(componentClazz);// in case clazz is a superclass
return true;
}
for (Method method : clazz.getDeclaredMethods()) {
if(method.toString().contains(signature)){
approvedClasses.add(clazz);
approvedClasses.add(componentClazz);
return true;
};
}
clazz = clazz.getSuperclass(); // search for superclass as well
}
declinedClasses.add(componentClazz);
return false;
}
public static void main(String[] args) {
JComboBox<?> comboBox = new JComboBox<>();
JButton button = new JButton();
JMenuItem menuItem = new JMenuItem();
JList<?> list = new JList<>();
System.out.println(hasAddActionListener(comboBox,"addActionListener"));
System.out.println(hasAddActionListener(button,"removeActionListener"));
System.out.println(hasAddActionListener(menuItem,"addActionListener"));
System.out.println(hasAddActionListener(list,"addActionListener"));
System.out.println(approvedClasses);
System.out.println(declinedClasses);
}
}
<强>输出强>
true
true
true
false
[class javax.swing.JButton, class javax.swing.JComboBox, class javax.swing.AbstractButton, class javax.swing.JMenuItem]
[class javax.swing.JList]
答案 2 :(得分:-5)
尝试:if(someObject instanceof ActionListener)...