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

是否有用于实现addActionListener方法的对象的Java接口?,java,interface,actionlistener,Java,Interface,Actionlistener,我对Java还比较陌生,所以可能完全走错了方向。是否有用于实现addActionLister方法的对象的接口,以便我可以使用这样的测试来确定是否可以向其添加ActionLister if (someObject instanceof WhatShouldThisBe){ someObject.addActionListener(...); } 我尝试了各种方法,但找不到一种有效的方法,也找不到如何在javadoc文档中搜索该方法的方法 我试图通过迭代myForm.getComponen

我对Java还比较陌生,所以可能完全走错了方向。是否有用于实现addActionLister方法的对象的接口,以便我可以使用这样的测试来确定是否可以向其添加ActionLister

if (someObject instanceof WhatShouldThisBe){
    someObject.addActionListener(...);
}
我尝试了各种方法,但找不到一种有效的方法,也找不到如何在javadoc文档中搜索该方法的方法

我试图通过迭代myForm.getComponents,将动作监听器同时添加到表单中的所有组件。问题是,根据我的IDE,它提供了一个组件对象数组,而组件类至少没有addActionListener方法


提前感谢您的帮助。

尝试:ifsomeObject instanceof ActionListener…

根据Javadoc for JButton,addActionListener方法在抽象超类AbstractButton中声明。它不是一个接口,但它可以满足您的需要。如果你写信

if (someObject instanceof AbstractButton)

然后,您将获取任何JBut纽、JMunuItor或JToGGLeButn.< /P> < P>如果您的程序中除了JButt、JMunuItand和JToGGLeButt之外有JButices对象,而点不扩展AbExtudio按钮-示例JCOMBOBOX——您可以考虑使用反射。 其思想是保留两个独立的集合,一个用于ApprovedClass,另一个用于DeclinedClass,该类不包含此类方法签名

这样可以节省一些时间,因为用于搜索给定方法签名的方法将在给定类组件的层次结构树中的所有类中进行搜索

因为表单包含很多组件,所以时间非常关键

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);
    }
}

OP要求接口声明方法addActionListener,而不是对象是否是该方法的有效参数。如果someObject.class.getDeclaredMethodaddActionListener,则新类[]{ActionListener.class}!=这听起来像个XY问题。你想达到什么目标?为什么你试图在不知道组件是什么的情况下,向任意组件添加一个动作侦听器?我没有足够的票数,但我支持@JBNizet-你的问题是,你的问题的真正答案是,你正在以一种完全错误的方式处理事情,你不应该让GUI组件结构决定控件如何添加监听器。谢谢你的评论@JBNizet和Hovercraft,你说得对。我的目标是添加一个热键,该热键可以在表单的所有字段中工作,但我懒得去想我可以迭代它们,而不是跟踪创建的内容。当然,这些都不是接口,问题是有接口吗…@Yahya,如果OP正在寻找addActionListener,那么他/她正在使用Swing。谢谢,我在荡秋千。这似乎是一个很好的方法,尽管我必须测试它是JList的成员还是JTextComponent的成员。我可能只是有点懒,希望有一个接口可以把它们都收集起来。但是JList和JTextComponent没有addActionListener方法,尽管JTextField有。哦,那可能是更相关的问题;我去重新考虑一下。
true
true
true
false
[class javax.swing.JButton, class javax.swing.JComboBox, class javax.swing.AbstractButton, class javax.swing.JMenuItem]
[class javax.swing.JList]