我有以下代码
import java.awt.*;
import java.awt.event.*;
import java.lang.reflect.*;
import javax.swing.*;
class QueueTest {
public static void main(String[] args) throws InterruptedException,
InvocationTargetException {
EventQueue eventQueue =
Toolkit.getDefaultToolkit().getSystemEventQueue();
eventQueue.push(new MyEventQueue());
Frame f=new Frame();
f.setSize(400,400);
//f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setLocation(150,150);
f.setVisible(true);
Button b=new Button("button");
f.add(b);
b.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent ae)
{
System.out.println("button is clicked");
}
});
}
private static class MyEventQueue extends EventQueue {
public void postEvent(AWTEvent theEvent) {
// System.out.println("Event Posted");
System.out.println("The source of event is "+theEvent.getSource());
super.postEvent(theEvent);
}
}
}
我写了一个自定义EventQueue
。当我将Frame
替换为JFrame
而Button
替换为JButton
时,这种情况正在好转。但是为什么这不适用于AWT组件?
当我调整框架大小时,单击按钮,控件未输入postEvent()
方法。但在摇摆中,它进入了。为什么会这样?
AWT中EventQueue
的事件不是?还有谁将活动发布到此EventQueue
? Windows内核?
请回复我。
答案 0 :(得分:1)
AWT事件放在队列中,但不使用方法postEvent
。该方法的存在是为了允许AWT之外的代码发布事件。您应该已经注意到,通过这种方式发布的事件非常少。
如果您覆盖方法protected void dispatchEvent(AWTEvent event)
,您会看到更多事件,包括Button
个事件。
但是,不建议乱用事件队列。一旦另一段代码推送新队列,它将失败。它有一些其他的奇怪之处。
如果要全局检测ActionEvent
,请使用
Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener() {
public void eventDispatched(AWTEvent event)
{
System.out.println("eventDispatched: "+event);
}
}, AWTEvent.ACTION_EVENT_MASK);