是否有实现addActionListener方法的对象的Java接口?

时间:2017-06-29 22:58:21

标签: java interface actionlistener

我对Java很新,所以可能会以完全错误的方式解决这个问题。是否存在实现addActionLister方法的对象的接口,这样我可以使用这样的测试来查明是否可以向其添加ActionListener。

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

我已经尝试了各种各样的东西,但是找不到有效的方法或者找出如何搜索文档的方法(javadoc)。

我试图通过迭代来同时向表单中的所有组件添加动作侦听器,myForm.getComponents()问题是,它提供了一个Component对象数组,而Component类没有&#39 ; t有一个addActionListener方法(至少,根据我的IDE,无论如何)。

提前感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

根据JButton的Javadoc,addActionListener方法在抽象超类AbstractButton中声明。它不是interface,但它可以满足您的需求。如果你写

if (someObject instanceof AbstractButton)

然后您将选择JButtonJMenuItemJToggleButton

答案 1 :(得分:0)

如果您的计划中有JComponents个对象,而JButtonJMenuItemJToggleButton

em> 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)...