2017-06-29 12 views
-3

私はJavaの方がやや新しいので、間違ったやり方をしているかもしれません。 addActionListerメソッドを実装するオブジェクトのインターフェイスがあります。このようなテストを使用して、ActionListenerを追加できるかどうかを調べることができます。addActionListenerメソッドを実装するオブジェクト用のJavaインターフェイスはありますか?

if (someObject instanceof WhatShouldThisBe){ 
    someObject.addActionListener(...); 
} 

私はいろいろ試してみましたが、そのメソッドのドキュメント(javadoc)の検索方法や仕組みを見つけることができません。

私は、フォーム上のすべてのコンポーネントに同時にアクションリスナーを追加しようとしています。myForm.getComponents()問題は、コンポーネントオブジェクトの配列を与え、ComponentクラスにはaddActionListenerメソッドがありませんとにかく私のIDEによると、少なくとも)。

ご協力いただきありがとうございます。

+0

なぜあなたは([のjavadoc]をチェックしませんhttps://docs.oracle.com/javase/8/docs/api/index-files/index -1.html)? – Andreas

+1

'if(someObject.class.getDeclaredMethod(" addActionListener "、new Class [] {ActionListener.class})!= null)' –

+2

これはXY質問のようです。あなたは何を達成しようとしていますか?なぜあなたは帽子を知らなくても、任意のコンポーネントにアクションリスナーを追加しようとしていますか? –

答えて

1

JButtonのJavadocによると、addActionListenerメソッドは抽象スーパーAbstractButtonで宣言されています。それはinterfaceではありませんが、それはあなたが必要とするものです。あなたは

if (someObject instanceof AbstractButton) 

を書くなら、あなたはどのJButtonJMenuItemまたはJToggleButtonを拾うでしょう。

+1

もちろん、これらはどれも* interfaces *ではありません。質問には「インタフェースがありますか?」と書かれています。* – Andreas

+0

これは 'Swing'でも' JavaFX'でも有効です! – Yahya

+0

@ Yahya、OPが 'addActionListener'を探しているなら、彼はSwingを使っています。 –

-5

試してみてください。(SomeObjectのinstanceofはのActionListener)場合...

+0

OPは、メソッドがメソッドの有効なパラメータであるかどうかではなく、メソッドaddActionListener()を宣言しています。 – Andreas

0

あなたはないAbstractButton〜実施例JComboBoxを拡張ドットJComponentsJButton以外のプログラム内のオブジェクト、JMenuItemJToggleButtonている場合 - あなたは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] 
関連する問題