我有以下一段代码
import java.awt.*;
import java.awt.event.*;
import java.lang.reflect.*;
import javax.swing.*;
class QueueTest {
static int i=0;
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.setLayout(new FlowLayout());
f.setVisible(true);
Button b=new Button("button");
//b.setEnabled(false);
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);
}
protected void dispatchEvent(AWTEvent event)
{
System.out.println("The source of event ("+(i++)+") is
"+event.getSource());
super.dispatchEvent(event);
}
}
}
在输出中,我有时可以看到
The source of event is (78) sun.awt.windows.WToolkit@77ef83
当我认为我只有两个来源时,java.awt.Button
和java.awt.Frame
。此外,当我按下鼠标时,我可以看到正在生成两个事件,一个是sun.awt.windows.WToolkit
是源,另一个是Button
(当我单击按钮时)。
我的问题是
- 什么是sun.awt.windows.WToolkit
- 为什么我可以在一次鼠标按压中看到两个事件
名称不言自明:AWT
代表抽象窗口工具包,这意味着Toolkit
是abstract
,需要实际实现。sun.awt.windows.WToolkit
是MicrosoftWindows平台的一个实现,因此W
在其名称中。在其他操作系统上,您会看到不同的实现,例如Linux上的sun.awt.X11.XToolkit
。如果您只执行System.out.println(Toolkit.getDefaultToolkit());
,您将看到Toolkit
的字符串表示与您不时看到的事件源的字符串表示相匹配。
我建议您对整个事件进行print
,而不仅仅是源。然后你会看到这些活动是为了什么。您将看到工具箱生成的事件类型。你会看到,鼠标点击最多可以生成三个事件:一个用于按下,一个用于释放,如果按下和释放发生在同一位置,则被视为点击。
您使用*字符实现了所有库。因此,输出指定了事件发生的来源。