あなたはないAbstractButton
〜実施例JComboBox
を拡張ドットJComponents
JButton
以外のプログラム内のオブジェクト、JMenuItem
とJToggleButton
ている場合 - あなたはReflection
を使用して検討することを。
考え方は、approvedClasses
と、そのようなメソッドシグネチャを含まないdeclinedClasses
の2つの別々のセットを保持することです。
この方法では、指定されたメソッドシグネチャを検索するメソッドは、指定されたクラスコンポーネントの階層ツリー内のすべてのクラスを検索するため、時間を節約できます。
多くのコンポーネントを含むフォームがあるため、時間が重要です。
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]
なぜあなたは([のjavadoc]をチェックしませんhttps://docs.oracle.com/javase/8/docs/api/index-files/index -1.html)? – Andreas
'if(someObject.class.getDeclaredMethod(" addActionListener "、new Class [] {ActionListener.class})!= null)' –
これはXY質問のようです。あなたは何を達成しようとしていますか?なぜあなたは帽子を知らなくても、任意のコンポーネントにアクションリスナーを追加しようとしていますか? –