0

当我们实现Listener、Renderer或者Editor的时候,Java里面的方法是怎么自动调用的呢?

代码:

Class A implements ActionListener{
   A(){
    //bla bla
    //bla bla 
    this.addActionListener(btn);

   }
   public void actionPerformed(ActionEvent e){**// How actionPerformed method called        //automatically if we register button**

   }
}

注册按钮对象后如何自动调用actionPerformed方法?我们只是将 btn 对象传递给addActionListener(btn)。它怎么调用那个方法呢?

我检查了netbeans里面的addActionListener方法*。没有method的调用actionPerformed方法。此外,如果我们注册它会继续工作。它是在内部的任何地方通过线程调用吗?但我检查了源代码。什么都没有。如何?

4

4 回答 4

3

使用API中概述并在此处讨论的约定EventListenerList从父级拥有的调度事件。编辑器和渲染器由拥有的视图组件调用。JComponent

附录:我们可以创建和原来一样的界面吗?如何?

是的,JFreeChart这是一个相当容易理解的例子。尽管图表本身不是 a JComponent,但它对自己的事件使用相同的模型

于 2012-08-28T05:26:17.853 回答
2

在 Java 中,任何 Windows 组件上发生的任何事情都由Event Dispatcher Thread处理:

事件分派线程 (EDT) 是 Java 中用于处理来自抽象窗口工具包 (AWT) 图形用户界面事件队列的事件的后台线程。这些事件主要是导致用户界面组件重绘自身的更新事件,或来自输入设备(如鼠标或键盘)的输入事件。

每当您单击或执行某些事件时,都是 EDT 启动动作侦听器,这就是为什么Thread.sleep在您的动作侦听器中执行任何操作最终都会冻结 UI 一段时间。

由于您的类实现了给定的接口,因此您的类将向 EDT 保证它将具有一系列方法,EDT 可以使用这些方法来完成它需要的任何事情。

有关 EDT 的更多信息,请查看Oracle 文档。

于 2012-08-28T05:26:09.477 回答
2

这是魔法。

事件处理由AWTAPI 为您处理。然后将这些事件排队并分派到各个组件(通过一系列步骤)。然后,每个相关方都会处理他们感兴趣的请求,然后再将它们传递到食物链上,直到到达您手中。

问题是,你应该关心吗?

在某些方面是的,但你关心电力是如何工作的,还是只关心你可以打开电灯开关?

我敢肯定有更好的文档,但你可以看看http://docs.oracle.com/javase/1.3/docs/guide/awt/designspec/events.html对于初学者......

于 2012-08-28T05:28:04.843 回答
1

当动作发生时,Swing 会自动调用您的 ActionListener。实际的方法调用位于 Swing 源代码的深处。

于 2012-08-28T05:23:15.467 回答