当我们实现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)。如何在内部调用该方法?
我通过addActionListener
方法*中的netbeans进行了检查。 没有actionPerformed
方法的调用方法。如果我们注册它继续工作。它是否通过>中的任何地方的线程调用?但我检查了源代码。 什么都没有。怎么样?
答案 0 :(得分:3)
使用EventListenerList
中列出的约定API,从父JComponent
拥有的here调度事件。 Editors and Renderers由拥有的视图组件引发。
附录:我们可以创建相同的界面吗?怎么样?的
是的,JFreeChart
是一个相当容易获得的例子。虽然图表本身不是JComponent
,但它使用same model作为其自己的events。
答案 1 :(得分:2)
在Java中,任何发生在任何Windows组件上的内容都由Event Dispatcher Thread:
处理事件调度线程(EDT)是Java中使用的后台线程 从Abstract Window Toolkit(AWT)图形处理事件 用户界面事件队列。这些事件主要是更新事件 导致用户界面组件重绘或输入 输入设备(如鼠标或键盘)中的事件。
无论何时单击或执行某些事件,EDT都会启动动作侦听器,这就是为什么在动作侦听器中执行任何Thread.sleep
最终会冻结UI一段时间。
由于你的类实现了一个给定的接口,你的类将保证EDT它将拥有一系列EDT可以用来做任何需要的方法。
有关EDT的更多信息,请查看this Oracle文档。
答案 2 :(得分:2)
这很神奇。
AWT
API会为您处理事件处理。然后将这些事件排队并分派到各个组件(通过一系列步骤)。然后,每个感兴趣的一方处理那些他们感兴趣的请求,然后将它们传递到食物链,直到它到达您。
问题是,你在乎吗?
在某些方面是的,但是你关心电的工作原理还是你可以打开电灯开关?
我确信有更好的文档,但你可以看一下http://docs.oracle.com/javase/1.3/docs/guide/awt/designspec/events.html的初学者......
答案 3 :(得分:1)
当操作发生时,Swing会自动调用ActionListener。实际的方法调用位于Swing源代码的深处。