用Java创建自定义事件

con*_*doi 184 java events listener handler

我想在Java中做这样的事情,但我不知道如何:

当事件"对象1说'你好''发生时,对象2通过说"你好"来响应该事件.

有人可以给我一个提示或示例代码吗?

aio*_*obe 400

您可能想要查看观察者模式.

以下是一些示例代码:

import java.util.*;

// An interface to be implemented by everyone interested in "Hello" events
interface HelloListener {
    void someoneSaidHello();
}

// Someone who says "Hello"
class Initiater {
    private List<HelloListener> listeners = new ArrayList<HelloListener>();

    public void addListener(HelloListener toAdd) {
        listeners.add(toAdd);
    }

    public void sayHello() {
        System.out.println("Hello!!");

        // Notify everybody that may be interested.
        for (HelloListener hl : listeners)
            hl.someoneSaidHello();
    }
}

// Someone interested in "Hello" events
class Responder implements HelloListener {
    @Override
    public void someoneSaidHello() {
        System.out.println("Hello there...");
    }
}

class Test {
    public static void main(String[] args) {
        Initiater initiater = new Initiater();
        Responder responder = new Responder();

        initiater.addListener(responder);

        initiater.sayHello();  // Prints "Hello!!!" and "Hello there..."
    }
}
Run Code Online (Sandbox Code Playgroud)

相关文章:Java:创建自定义事件

  • @GlassGhost:它被拒绝了,因为它基本上是一个完全重写.如果他们修复拼写错误和格式化以及破坏链接等,那么编辑其他人的答案是好的,但他们不应从根本上改变内容.(有些例外适用于标记为"社区维基"的帖子.) (8认同)
  • 如果多个线程正在生成源事件,这会正确同步吗? (2认同)

Boz*_*zho 27

你想要的是观察者模式的实现.你可以完全自己做,或者使用像java.util.Observer和这样的java类java.util.Observable

  • 重用-回收。但请看http://stackoverflow.com/questions/2380676/is-java-util-observable-used-anywhere (2认同)

Gla*_*ost 21

您可以通过3种不同的方式进行设置:

  1. Thrower 代替 Catcher
  2. Catcher 代替 Thrower
  3. Thrower并且Catcher在此示例中的另一个类内部Test

工作GITHUB示例I CITING默认为选项3,尝试其他人只需取消注释Optional要成为主要类的""代码块,并将该类设置为文件中的${Main-Class}变量build.xml:

投掷边码所需的4件事:

import java.util.*;//import of java.util.event

//Declaration of the event's interface type, OR import of the interface,
//OR declared somewhere else in the package
interface ThrowListener {
    public void Catch();
}
/*_____________________________________________________________*/class Thrower {
//list of catchers & corresponding function to add/remove them in the list
    List<ThrowListener> listeners = new ArrayList<ThrowListener>();
    public void addThrowListener(ThrowListener toAdd){ listeners.add(toAdd); }
    //Set of functions that Throw Events.
        public void Throw(){ for (ThrowListener hl : listeners) hl.Catch();
            System.out.println("Something thrown");
        }
////Optional: 2 things to send events to a class that is a member of the current class
. . . go to github link to see this code . . .
}
Run Code Online (Sandbox Code Playgroud)

2类文件中从类接收事件所需的东西

/*_______________________________________________________________*/class Catcher
implements ThrowListener {//implement added to class
//Set of @Override functions that Catch Events
    @Override public void Catch() {
        System.out.println("I caught something!!");
    }
////Optional: 2 things to receive events from a class that is a member of the current class
. . . go to github link to see this code . . .
}
Run Code Online (Sandbox Code Playgroud)

  • 这是我见过的最奇怪的代码风格之一 (30认同)
  • @GlassGhost:我不认为你的答案总体上是不够的.我看到它的问题是代码不会按原样运行 - 你试图使用`main`中的`this`,它不能在任何已发布的Java版本中编译.如果那部分是在构造函数中,或者如果`main`创建了一个`new Catcher1()`并使用它而不是`this`,它应该工作,即使在1.6+. (7认同)
  • @GlassGhost:问题是`main`是静态的,静态函数中没有`this`这样的东西.你需要在某处创建一个`new Catcher1()`,然后传递那个实例.1.5在静态环境中也不允许"this"; 我很确定它从未被允许过. (6认同)
  • @GlassGhost:使用`this`的代码在构造函数中,而不是在`main`中.这就是它的原因.把它移到'main`,我保证不会.这就是人们一直试图告诉你的,以及你的答案正在尝试做什么.我不知道github上有什么 - 我关心的是什么.而你所拥有的东西就被破坏了. (6认同)
  • @GlassGhost:"声明为`static`的方法称为类方法.总是调用类方法而不引用特定对象.尝试使用关键字`this`或关键字`super`引用当前对象或者引用类方法体中任何周围声明的类型参数会导致编译时错误." - [JLS for Java 5,§8.4.3.2](http://docs.oracle.com/javase/specs/jls/se5.0/html/classes.html#8.4.3.2) (6认同)
  • 因为main是静态的,所以不能在main中使用'this'字面值. (5认同)
  • @GlassGhost:除非您指向文件和行,否则您的链接无法证明您的答案代码是否有效.我当然不明白.如果您不相信任何人,请尝试在您自己的答案中编译代码. (4认同)
  • 不要与try-throw-catch混淆!名字选择不当,可以选择. (4认同)
  • @GlassGhost.在尝试时,它给了我java JDK 1.6的编译时错误."不能在静态环境中使用它". (3认同)
  • @GlassGhost:我认为你把编写代码的样式与结果序列的样式混淆了. (2认同)
  • @Eric 这里没有混淆;这叫做笑话。 (2认同)
  • 我看到你从静态上下文中删除了`this`的使用,很高兴看到你已经学习了Java的基础知识. (2认同)

Iva*_*van 6

以下不完全相同但相似,我正在寻找一个片段来添加对接口方法的调用,但发现了这个问题,所以我决定为那些像我一样搜索它并发现这个问题的人添加这个片段:

 public class MyClass
 {
        //... class code goes here

        public interface DataLoadFinishedListener {
            public void onDataLoadFinishedListener(int data_type);
        }

        private DataLoadFinishedListener m_lDataLoadFinished;

        public void setDataLoadFinishedListener(DataLoadFinishedListener dlf){
            this.m_lDataLoadFinished = dlf;
        }



        private void someOtherMethodOfMyClass()
        {
            m_lDataLoadFinished.onDataLoadFinishedListener(1);
        }    
    }
Run Code Online (Sandbox Code Playgroud)

用法如下:

myClassObj.setDataLoadFinishedListener(new MyClass.DataLoadFinishedListener() {
            @Override
            public void onDataLoadFinishedListener(int data_type) {
                }
            });
Run Code Online (Sandbox Code Playgroud)