在看代码时候碰到的,记录一下
英语定义EventQueue (Java SE 23 & JDK 23) (oracle.com)
SwingUtilities.invokeLater()
是一个用于确保 Swing 组件的更新和事件处理在事件调度线程(Event Dispatch Thread,简称 EDT)中执行的方法。Swing 是一个单线程框架,所有的界面更新和事件处理都应该在 EDT 中进行,以避免潜在的线程安全问题。
下面是如何使用 SwingUtilities.invokeLater()
的步骤:
- 创建一个
Runnable
对象,这个对象包含你想要在 EDT 中执行的代码。Lambda可以作为Runnable对象。 - 将这个
Runnable
对象传递给SwingUtilities.invokeLater()
方法。
以下是一个简单的例子:
import javax.swing.*;
public class Example {
public static void main(String[] args) {
// 创建一个 Runnable 对象
Runnable task = new Runnable() {
public void run() {
// 在这里编写需要在 EDT 中执行的代码
// 例如,创建和显示一个 JFrame
JFrame frame = new JFrame("Example");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300, 200);
frame.setVisible(true);
}
};
// 使用 SwingUtilities.invokeLater() 来确保 task 在 EDT 中执行
SwingUtilities.invokeLater(task);
}
}
在这个例子中,我们创建了一个 Runnable
对象,它的 run
方法包含了创建和显示一个 JFrame
的代码。然后我们使用 SwingUtilities.invokeLater(task)
来确保这段代码在 EDT 中执行。
如果你使用的是 Java 8 或更高版本,你可以使用 lambda 表达式来简化代码:
import javax.swing.*;
public class Example {
public static void main(String[] args) {
// 使用 lambda 表达式简化 Runnable 对象的创建
SwingUtilities.invokeLater(() -> {
JFrame frame = new JFrame("Example");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300, 200);
frame.setVisible(true);
});
}
}
在这个简化的版本中,我们直接在 SwingUtilities.invokeLater()
的参数中使用了 lambda 表达式,它创建并显示了 JFrame
。这样做可以减少代码量,并且使代码更加简洁。