为了账号安全,请及时绑定邮箱和手机立即绑定

java.awt.EventQueue.invokeLater解释

java.awt.EventQueue.invokeLater解释

繁华开满天机 2019-10-17 15:46:46
我很好奇为什么我们必须使用它java.awt.EventQueue.invokeLater来控制挥杆部件。为什么我们不能在普通线程中这样做?幕后到底发生了什么?从我注意到的情况(如果有),JFrame可以在不出现任何错误的情况下从主线程将可见性设置为true或false,并且它确实起作用。那么我到底通过使用实现了java.awt.EventQueue.invokeLater什么呢?我也完全知道我可以使用,SwingUtilities.invokeLater但是正如这里所解释的,它们似乎是一回事。感谢任何人的解释。希望这是一个有效的问题。编辑:回答wumpz问题我们可以创建一个jframeJFrame 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());}而且没有怨言。
查看完整描述

2 回答

?
慕工程0101907

TA贡献1887条经验 获得超5个赞

完整的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[]) {

    java.awt.EventQueue.invokeLater(new Runnable() {

        public void run() {

            new NewJFrame().setVisible(true);

        }

    });

}


查看完整回答
反对 回复 2019-10-17
?
慕勒3428872

TA贡献1848条经验 获得超6个赞

所有受支持的平台都提供单线程图形库。摇摆是跨平台的。因此,Swing GUI对象应仅在事件分发线程上构造和操作。


顺便说SwingUtilities.invokeLater()一句,是EventQueue.invokeLater()自1.3版以来的封面。


查看完整回答
反对 回复 2019-10-17
  • 2 回答
  • 0 关注
  • 1911 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信