gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 11:22:55 24 4
gpt4 key购买 nike

我有如下一段代码

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() 方法。但在 Swing 中,它被输入了。为什么会这样?

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

请回复我。

最佳答案

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

关于java - 为什么事件没有发布到 AWT EventQueue?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21479627/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com