【问题标题】:Is there a Java interface for objects which implement an addActionListener method?是否有用于实现 addActionListener 方法的对象的 Java 接口?
【发布时间】:2017-12-03 19:24:13
【问题描述】:

我对 Java 还很陌生,所以可能会以完全错误的方式进行处理。是否有实现addActionLister 方法的对象接口,这样我就可以使用这样的测试来确定是否可以向其添加ActionListener。

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

我尝试了各种方法,但找不到有效的方法,也找不到如何在文档 (javadoc) 中搜索该方法。

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

提前感谢您的帮助。

【问题讨论】:

  • if (someObject.class.getDeclaredMethod("addActionListener", new Class[] { ActionListener.class }) != null)
  • 这听起来像是一个 XY 问题。你想达到什么目的?你为什么要尝试向任意组件添加动作侦听器,甚至不知道它们是什么?
  • 我没有投票,但我支持@JBNizet——你的问题是XY Problem,你的问题的真正答案是你正在做的事情完全错误的方式,您不应该让 GUI 组件结构决定控件如何添加侦听器。
  • 感谢您的 cmets @JBNizet 和 Hovercraft,您说得对。我的目标是添加一个可以在表单的所有字段中使用的热键,但是我懒惰地认为我可以遍历它们而不是跟踪已创建的内容。

标签: java interface actionlistener


【解决方案1】:

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

if (someObject instanceof AbstractButton)

然后你会选择任何JButtonJMenuItemJToggleButton

【讨论】:

  • 当然,这些都不是接口,问题说“有接口吗……”
  • @Yahya,如果 OP 正在寻找 addActionListener,那么他/她正在使用 Swing。
  • 谢谢,我在Swing 工作。这似乎是一个好方法,尽管我必须测试它是否也是JListJTextComponent 的成员。我可能只是有点懒,希望有一个界面可以将它们全部选中。
  • 但是JListJTextComponent 没有addActionListener 方法(尽管JTextField 有)。
  • 糟糕,这可能是更相关的问题;我会去重新考虑。
【解决方案2】:

如果您的程序中有JComponents 对象,而不是JButtonJMenuItemJToggleButton,那么该点 扩展 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]

【讨论】:

    【解决方案3】:

    尝试:if(someObject instanceof ActionListener) ...

    【讨论】:

    • OP 要求的是接口声明方法addActionListener(),而不是对象是否是该方法的有效参数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-29
    • 2013-08-16
    • 1970-01-01
    • 2010-10-20
    相关资源
    最近更新 更多