为什么事件没有发布到AWT EventQueue?

时间:2014-01-31 12:01:42

标签: java swing events event-handling awt

我有以下代码

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替换为JFrameButton替换为JButton时,这种情况正在好转。但是为什么这不适用于AWT组件?

当我调整框架大小时,单击按钮,控件未输入postEvent()方法。但在摇摆中,它进入了。为什么会这样?

AWT中EventQueue的事件不是?还有谁将活动发布到此EventQueue? Windows内核?

请回复我。

1 个答案:

答案 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);