猿问

java.awt.EventQueue.invokeLater解释

我很好奇为什么我们必须使用它java.awt.EventQueue.invokeLater来控制挥杆部件。


为什么我们不能在普通线程中这样做?幕后到底发生了什么?从我注意到的情况(如果有),JFrame可以在不出现任何错误的情况下从主线程将可见性设置为true或false,并且它确实起作用。那么我到底通过使用实现了java.awt.EventQueue.invokeLater什么呢?我也完全知道我可以使用,SwingUtilities.invokeLater但是正如这里所解释的,它们似乎是一回事。


感谢任何人的解释。希望这是一个有效的问题。


编辑:回答wumpz问题我们可以创建一个jframe


JFrame frame = new JFrame("Hello world");

frame.setSize(new Dimension(300, 300));

frame.setPreferredSize(new Dimension(300, 300));

frame.setMaximumSize(new Dimension(300, 300));

frame.setMinimumSize(new Dimension(300, 300));

frame.setVisible(true);

frame.pack();

frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

在创建的同一线程上,执行以下操作。


for (int i = 0; i < 34; i++)

{

    System.out.println("Main thread setting to "+(!frame.isVisible()));

    frame.setVisible(!frame.isVisible());

}

而且没有怨言。


繁华开满天机
浏览 1912回答 2
2回答

慕工程0101907

完整的Swing处理是在称为EDT(事件调度线程)的线程中完成的。因此,如果您要在此线程中进行一些长时间的计算,则会阻塞GUI。此处的方法是在另一个线程中处理您的计算,因此您的GUI保持响应。最后,您需要更新您的GUI,这必须在EDT中完成。现在EventQueue.invokeLater开始发挥作用。它Runnable在Swings事件列表的末尾发布一个事件(您的),并在处理完所有先前的GUI事件之后进行处理。也EventQueue.invokeAndWait可以在这里使用。所不同的是,您的计算线程将一直阻塞,直到您的GUI更新为止。因此很明显,不能在EDT中使用它。注意不要从其他线程更新Swing GUI。在大多数情况下,这会产生一些奇怪的更新/刷新问题。仍然有Java代码可以从主线程简单地启动JFrame。这可能会导致问题,但不能阻止它摇摆。现在,大多数现代IDE都会创建类似这样的内容来启动GUI:public static void main(String args[]) {&nbsp; &nbsp; java.awt.EventQueue.invokeLater(new Runnable() {&nbsp; &nbsp; &nbsp; &nbsp; public void run() {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; new NewJFrame().setVisible(true);&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; });}

慕勒3428872

所有受支持的平台都提供单线程图形库。摇摆是跨平台的。因此,Swing GUI对象应仅在事件分发线程上构造和操作。顺便说SwingUtilities.invokeLater()一句,是EventQueue.invokeLater()自1.3版以来的封面。
随时随地看视频慕课网APP

相关分类

Java
我要回答