java - "java.awt.EventQueue.invokeLater"或"new Myframe().setVisible(true) , What'有什么区别?

标签 java swing

打开新 Jframe 的最佳方式是什么?

这个:

java.awt.EventQueue.invokeLater(() -> {
        JFrame f = new Main();
        f.setVisible(true);
    });

或者这个:

JFrame f = new Myframe();
f.setVisible(true);

它们之间有什么区别?

最佳答案

最好的方法是使用:

创建框架不会影响 Swing 线程,因为它不会计算组件,直到被要求使其可见。 问题是当线程需要渲染组件,并且代码没有在 swing 线程中运行时。 (这已在 JavaFX 中强制执行)

JFrame f = new JFrame();
//Java 7
SwingUtilities.invokeLater(new Runnable() {
    public void run() {
        f.setVisible(true);
    }
});
//Java 8
SwingUtilities.invokeLater(() -> f.setVisible(true));

另一件事是你正在混合框架,这从来都不是一个好主意。不要使用 awt 线程来渲染 swing 组件。即使 Swing 确实调用了 awt 线程,您也不应该混合购买自己的线程。想象一下 Swing invokeLater 实现发生变化,您将使用直接调用 awt 的旧实现。

编辑:

为了澄清差异:

java.awt.EventQueue.invokeLater(() -> {
        JFrame f = new Main();
        f.setVisible(true);
    });

第一个代码要求 Swing(或者实际上是 awt)将此请求排队并在可以时处理它。

JFrame f = new Myframe();
f.setVisible(true);

第二个代码在调用它的当前线程中运行。可能是 Swing 线或任何其他线。

关于java - "java.awt.EventQueue.invokeLater"或"new Myframe().setVisible(true) , What'有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43673510/

相关文章:

java - 列表<对象> 和列表<?>

java - Spring Boot Starters中maven版本是怎么指定的?

java - 使用 Arrays.binarySearch 将字符串与对象进行比较

java - 自定义表原始对象

java - 在 Swing 中的 JLabel 上显示按钮

Java JFrame 项目位置/大小

java - Tomcat 7.50+JDK 64bit 1.7.0.51 启动问题

java - 使用JasperReports,Hibernate和Spring时发生奇怪的错误

java - 如何仅调用一次 componentResized 方法(当用户停止按住鼠标按钮时)?

java : converting anonymous inner class to concrete class