当前位置: 首页 > 面试题库 >

是否可以编写自己的发出ActionEvent的对象?

韩智明
2023-03-14
问题内容

我在网上看过Java教程,它们似乎都与捕获其他已编写组件给出的ActionEvent有关。是否有可能编写自己的对象,而这些对象具有一组自己的条件,这些条件会触发actionEvents,然后可以由已注册为侦听器的其他类捕获该actionEvents?

因此,例如:如果我希望一个对羊计数的对象在已注册为侦听器的所有睡眠者对象上计数了100只羊后发送一个actionEvent。

有没有办法做到这一点,在线上有任何教程吗?

任何帮助是极大的赞赏。


问题答案:

是的,一旦有人向您展示如何创建自己的侦听器,这将非常简单。

首先,创建自己的EventObject。这是我的一个项目的示例。

import gov.bop.rabid.datahandler.bean.InmateDataBean;

import java.util.EventObject;

public class InmatePhotoEventObject extends EventObject {

    private static final long serialVersionUID = 1L;

    protected InmateDataBean inmate;

    public InmatePhotoEventObject(Object source) {
        super(source);
    }

    public InmateDataBean getInmate() {
        return inmate;
    }

    public void setInmate(InmateDataBean inmate) {
        this.inmate = inmate;
    }

}

除了扩展EventObject之外,此类没有什么特别的。您的构造函数由EventObject定义,但是您可以创建所需的任何方法。

其次,定义一个EventListener接口。

public interface EventListener {

    public void handleEvent(InmatePhotoEventObject eo);

}

您将使用创建的EventObject。您可以使用任何所需的方法名称。这是将作为对侦听器的响应编写的代码的接口。

第三,编写一个ListenerHandler。这是同一项目中的我的。

import gov.bop.rabid.datahandler.bean.InmateDataBean;
import gov.bop.rabid.datahandler.main.EventListener;
import gov.bop.rabid.datahandler.main.InmatePhotoEventListener;
import gov.bop.rabid.datahandler.main.InmatePhotoEventObject;

import java.util.ArrayList;
import java.util.List;

public class InmatePhotoListenerHandler {

    protected List<EventListener> listeners;

    public InmatePhotoListenerHandler() {
        listeners = new ArrayList<EventListener>();
    }

    public void addListener(EventListener listener) {
        listeners.add(listener);
    }

    public void removeListener(EventListener listener) {
        for (int i = listeners.size() - 1; i >= 0; i--) {
            EventListener instance = listeners.get(i);
            if (instance.equals(listener)) {
                listeners.remove(i);
            }
        }
    }

    public void fireEvent(final InmatePhotoEventObject eo, 
            final InmateDataBean inmate) {
        for (int i = 0; i < listeners.size(); i++) {
            final EventListener instance = listeners.get(i);
            Runnable runnable = new Runnable() {
                public void run() {
                    eo.setInmate(inmate);
                    instance.handleEvent(eo);
                }

            };
            new Thread(runnable).start();
        }
    }

    public static void main(String[] args) {
        System.out.println("This line goes in your DataHandlerMain class "
                + "constructor.");
        InmatePhotoListenerHandler handler = new InmatePhotoListenerHandler();
        System.out.println("I need you to put the commented method in "
                + "DataHandlerMain so I can use the handler instance.");

        // public InmatePhotoListenerHandler getInmatePhotoListenerHandler() {
        //      return handler;
        // }

        System.out.println("This line goes in the GUI code.");
        handler.addListener(new InmatePhotoEventListener());

        System.out.println("Later, when you've received the response from "
                + "the web service...");
        InmateDataBean inmate = new InmateDataBean();
        inmate.setIntKey(23);
        handler.fireEvent(new InmatePhotoEventObject(handler), inmate);
    }
}

此类中的主要方法显示了如何使用ListenerHandler。该类中的其余方法是标准的。您将使用自己的EventObject和EventListener。



 类似资料:
  • 对于简单的定制操作,我们或许可以通过使用layers.core.Lambda层来完成。但对于任何具有可训练权重的定制层,你应该自己来实现。 这里是一个Keras层应该具有的框架结构(1.1.3以后的版本,如果你的版本更旧请升级),要定制自己的层,你需要实现下面三个方法 build(input_shape):这是定义权重的方法,可训练的权应该在这里被加入列表`self.trainable_weigh

  • 对于简单的定制操作,我们或许可以通过使用layers.core.Lambda层来完成。但对于任何具有可训练权重的定制层,你应该自己来实现。 这里是一个Keras2的层应该具有的框架结构(如果你的版本更旧请升级),要定制自己的层,你需要实现下面三个方法 build(input_shape):这是定义权重的方法,可训练的权应该在这里被加入列表`self.trainable_weights中。其他的属性

  • 目标 写出一个loader,实现在html文件内容前面添加个人签名、以及自动替换掉敏感词汇的功能,当对应的词汇文件修改时,页面会自动刷新。该loader需能够协作其他loader,实现链式调用。 挑战 写出一个loader,要求每个模块文件依赖于各不相同的敏感词汇json文件。 知识点 1、node module:一个loader就是一个npm包,输出一个function; 2、npm publi

  • 问题内容: 如果我有一个包含的列表,并且想编写一个迭代器,以便对以’a’开头的元素进行迭代,那么我可以编写自己的迭代器吗?我怎样才能做到这一点 ? 问题答案: 当然。迭代器只是接口的实现。如果您使用中的现有可迭代对象(例如),则需要对其进行子类化并覆盖其功能,以便返回自己的对象,或者提供一种在特殊实例中包装标准迭代器的方法(具有被更广泛使用的优势)等。

  • 6.5.1.编写自己的对象,以及初始化的相关代码 Android程序中所有的构件(如Activity、Service、BroadcastReceiver、ContentProvider)都是继承一个Android框架中提供的基类,然后覆盖特定的方法。在这里,我们继承Activity类,覆盖了onCreate()方法。在第四章的"Activity的生命周期"一节 曾提到,Activity有个精心设计

  • 对于简单、无状态的自定义操作,你也许可以通过 layers.core.Lambda 层来实现。但是对于那些包含了可训练权重的自定义层,你应该自己实现这种层。 这是一个 Keras 2.0 中,Keras 层的骨架(如果你用的是旧的版本,请更新到新版)。你只需要实现三个方法即可: build(input_shape): 这是你定义权重的地方。这个方法必须设 self.built = True,可以通