【问题标题】:Why are events not posted to AWT EventQueue?为什么没有将事件发布到 AWT EventQueue?
【发布时间】:2014-02-24 02:55:06
【问题描述】:

我有以下代码

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 内核?

请回复我。

【问题讨论】:

    标签: java swing events event-handling awt


    【解决方案1】:

    AWT 事件被放置在队列中,但不使用方法postEvent。该方法的存在是为了允许 AWT 外部的代码发布事件。您应该已经注意到,以这种方式发布的活动数量很少。

    如果您覆盖方法protected void dispatchEvent(AWTEvent event),您将看到更多事件,包括Button 事件。

    但是,不建议乱搞事件队列。一旦另一段代码推送一个新队列,它将失败。它还有一些其他的奇怪之处。

    如果要全局检测ActionEvents,请使用

    Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener() {
      public void eventDispatched(AWTEvent event)
      {
        System.out.println("eventDispatched: "+event);
      }
    }, AWTEvent.ACTION_EVENT_MASK);
    

    【讨论】:

    • 有趣。但我能知道为什么会这样吗?谢谢。
    • @JavaTechnical:你的问题是什么?
    • 我的意思是,为什么很少没有。发布到 postEvent() 方法的事件数?
    • 如前所述,此方法并不是所有事件的通用入口点。它只是为了允许发布来自不同包的事件而存在。因此,通过覆盖该方法,您只会看到从 java.awt 包之外的代码发布的事件。
    • dispatchEvent() 负责队列的另一端;它将调度刚刚从队列中删除的事件。这会影响队列的几乎所有事件。请注意,Swing 将在创建后直接传递某些高级事件(例如树和表事件),而不需要对其进行排队。
    猜你喜欢
    • 2017-05-09
    • 2015-01-12
    • 1970-01-01
    • 2011-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-07
    • 1970-01-01
    相关资源
    最近更新 更多