当前位置: 首页 > 知识库问答 >
问题:

添加ActionListener到未知对象

储毅
2023-03-14

我有以下问题:

我有这样一个函数:

public void addActionListenerObject(Object object) {
    object.addActionListener(this);
}

我的问题如下:我需要一个解决方案,可以通过addActionListener函数作为参数传递任何对象。列表可在此处找到:https://docs.oracle.com/javase/tutorial/uiswing/events/eventsandcomponents.html

有没有一种方法可以在没有大量实例的情况下解决这个问题?

谢啦

共有3个答案

姚正真
2023-03-14

你要找的是多态性。类型 Component的所有实例都具有 addActionListener方法。将方法签名更改为 Component,而不是 Object

我认为 addActioListener是从 组件继承而来的。事实并非如此。该方法单独添加到每个组件类型,没有父类。

潘雅珺
2023-03-14

通过一个功能接口(

public class Just {
    private ActionListener actionListener;
    public void addActionListener(ActionListener actionListener) {
        this.actionListener = actionListener;
    }
    public void doIt() {
        System.out.println("Hello");
        actionListener.actionPerformed(new ActionEvent(this, 3, "World"));
    }
}

public class MyActionListener implements ActionListener {
    public void addActionListenerObject(Consumer<ActionListener> consumer) {
        consumer.accept(this);
    }
    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println(e.getActionCommand());
    }
}

这样,添加操作监听器的类(在我的示例中,这是Just)不需要实现接口。

使用它:

Just just = new Just();

MyActionListener listener = new MyActionListener();
listener.addActionListenerObject(just::addActionListener); // Aha!

just.doIt();

这张照片是:

Hello
World
司空俊悟
2023-03-14

保留签名

如果您无法更改方法签名(即,如果您必须接收对象,并且如果有这样的方法定义,则调用addActionListener()),则更通用/健壮的解决方案是使用Java反射检查实际对象是否定义了addActionListener()方法,也可以通过反思来实现。不管怎么说,这听起来是一个非常老套的方法。

更改签名

如果可以更改方法签名,请尝试使用AbstractButton(https://docs.oracle.com/javase/7/docs/api/javax/swing/AbstractButton.html#addActionListener(java.awt.event.ActionListener)),它是为JButtonJToggleButtonJMenuItem定义此方法的超类,例如(请参阅“直接已知子类”和类定义树以了解实际提供方法的位置)。

第二种方法只有在实际有一个超类定义该方法时才有效。如果有多个类,则必须使用If-else结构和instanceof显式强制转换检查可能的类(这样才能保留原始对象签名)。

如果您提供有关原始问题的更多信息(例如,为什么需要这种方法),我们可能会找到更好的方法。

 类似资料:
  • 问题内容: 如何将actionListener添加到使用netbeans放置的现有jCalendar的jDayChooser组件中? 我只想在单击日期按钮时才触发事件。当jCalendar中的propertyChange甚至侦听jMonthChooser和jYearChooser时 使用Toedter的jCalendar的PS 问题答案: 或者,你可以侦听特定的,。 附录: 如何使它适用于 ? 同

  • 我创建了一个JPanel,上面有我需要的所有JRadioButtons(称为PortSettings)。我还有一个按钮,叫做端口设置,当用户单击该按钮时,我需要JPanel上来显示单选按钮。我尝试将JPanel添加到actionlistener中,但没有效果。我的代码在下面。除了portsettings按钮之外,我已经从其他按钮中删除了所有其他ActionListener。如果这个问题让人困惑,我

  • 嗨,我的问题是我不能添加按钮到动作听者,我会做一个菜单,我不知道为什么我成为一个错误在这里代码包lvl; }哦,我变成了一个错误,错误说不能在静态上下文中使用它,它是由credits.addActionListener(this)创建的;请帮助我

  • 问题内容: 如何将动作侦听器添加到这些按钮,以便可以从主要方法调用actionperformed它们,因此单击它们时可以在程序中调用它们? 问题答案: 两种方式: 1.在你的类中实现,然后使用; 稍后,你必须定义一个方法。但是,对多个按钮执行此操作可能会造成混淆,因为该方法将必须检查每个事件()的来源以查看其来自哪个按钮。 2.使用匿名内部类: 稍后,你必须定义。当你有多个按钮时,这样做效果更好,

  • 我试图将ActionListener添加到一个标签中,每当用户键入错误的密码或登录时,该标签就会弹出。这是我的登录控制器 我如何能够解决这个问题?我已经尝试了很多次(setOnAction, addMouseListener),但都不起作用:(。 如果你不介意的话,我还想问一下public void initialize函数。这是干什么用的?当我创建类时,它会自动弹出。 提前感谢