4

我该如何实施?它可以跨多个程序集工作吗?如果没有,我怎样才能让它工作?

4

1 回答 1

14

冒着不完全理解这个问题的风险,我想提供另一种可能的解释。

谈到类,Java 有一个EventListener,.NET 有一个EventHandler。两者都有相同的目的:事件处理。但是在实现上存在差异。可以说,.NET 的事件处理是对 Java 事件监听器的更高层次的抽象。

Java 的 EventListener 是“所有事件监听器接口都必须扩展的标记接口”(即 MouseListener)。.NET 的 EventHandler 是一个委托,是一个指向处理事件的方法的强类型指针。

更广泛地说,事件侦听器是实现事件处理接口的对象,而事件处理程序只是处理事件的方法。一般来说,事件侦听器实现了一个观察者设计模式,而事件处理程序隐藏了该模式的所有管道。因此,编写一个事件监听器比编写一个事件处理程序更复杂,而且往往更加口头化。

我建议阅读 Microsoft 的Observer Design Pattern以更好地理解它。

因此,要实现事件处理程序,您只需将委托分配给您要处理的对象的事件。IE

Button.Click += new EventHandler(MyButton_Click); 

其中 MyButton_Click 是一个具有 EventHandler 签名并实际处理事件的方法(它可能在您的类中或其他地方),即

private void MyButton_Click(object sender, EventArgs e)
{
    doSomething();
}

为了在 Java 中使用事件监听器实现同样的效果,您可以编写如下内容(如果我犯了错误,请原谅我,因为我是从内存中编写的):

public class MyClass
{
    Button myButton;

    MyClass()
    {
        ...
        myButton.addMouseListener(new ButtonHandler());
    }

    public class ButtonHandler implements MouseListener
    {
        public void mousePressed(MouseEvent e) {}
        public void mouseReleased(MouseEvent e) {}
        public void mouseEntered(MouseEvent e) {}
        public void mouseExited(MouseEvent e) {}

        public void mouseClicked(MouseEvent e)
        {
           doSomething("Mouse clicked", e);
        }
    }
}

当然,有很多方法可以实现这种常见的观察者模式,包括在类本身、内部类、匿名类、适配器等中实现 EventListener 接口。但这应该说明这一点。

于 2012-07-13T22:36:47.547 回答