打开新 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/