SwingUtilities.invokeLater() 和 SwingUtilities.invokeAndWait() 怎么使用,给一个例子
时间: 2024-05-01 20:17:52 浏览: 106
Swing线程之SwingUtilities.invoke
好的,我明白了,以下是您所问的答案:
SwingUtilities.invokeLater() 和 SwingUtilities.invokeAndWait() 都可以在事件分派线程(Event Dispatch Thread)上执行 Runnable 对象。区别在于,invokeLater() 把 Runnable 对象放到事件分派线程的队列中等待执行,而 invokeAndWait() 则是阻塞当前线程,直到 Runnable 对象执行完成。
下面是一个使用 SwingUtilities.invokeLater() 的例子:
```java
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;
public class Example {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
JFrame frame = new JFrame("Hello, World!");
JLabel label = new JLabel("Hello, World!");
frame.getContentPane().add(label);
frame.pack();
frame.setVisible(true);
}
});
}
}
```
这个例子创建了一个 JFrame,在 JFrame 中添加了一个 JLabel,并把 JFrame 显示出来。使用 invokeLater() 保证了这些操作都在事件分派线程上执行。
下面是一个使用 SwingUtilities.invokeAndWait() 的例子:
```java
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;
public class Example {
public static void main(String[] args) throws Exception {
SwingUtilities.invokeAndWait(new Runnable() {
public void run() {
JFrame frame = new JFrame("Hello, World!");
JLabel label = new JLabel("Hello, World!");
frame.getContentPane().add(label);
frame.pack();
frame.setVisible(true);
}
});
System.out.println("Done!");
}
}
```
这个例子也创建了一个 JFrame,在 JFrame 中添加了一个 JLabel,并把 JFrame 显示出来。使用 invokeAndWait() 保证了这些操作都在事件分派线程上执行,并且会阻塞当前线程直到 JFrame 显示完成。最后,它打印了一条消息,表示所有操作都已完成。
阅读全文