Java Swing 让线程等待一次
Java Swing making the thread wait once
我试图让我的 GUI 在图形最近更新后等待 2 秒。这意味着我使用后:
boardLogo.repaint();
boardLogo.revalidate();
我希望 GUI 在进行进一步计算之前等待,然后再次绘制它们。
代码:
SwingUtilities.invokeLater(new Runnable() {
@SuppressWarnings("rawtypes")
@Override
public void run() {
SwingWorker swingWorkerExample = new SwingWorker(){
@Override
protected Object doInBackground() throws Exception {
return null;
}
protected void done(){
try {
Thread.sleep(2000); //wait 2 seconds.
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
swingWorkerExample.execute();
}
});
//.... more code here
boardLogo.repaint();
boardLogo.revalidate();
但是当我 运行 它 - 首先它执行最后两行,然后等待 2 秒...
老实说,我对线程和 Java Swing 的了解不是最好的(尤其是在理解 swing worker 方面,我曾尝试从 Oracle 站点阅读),所以我会如能详细解答,不胜感激
谢谢!
when I run it - first it executes the last two lines, then waits for 2 seconds ... my knowledge about Threads and Java Swing is not the best.
你说,它 执行最后两行。有没有想过它是什么?
它是一个线程。线程是在 Java 程序中执行代码的东西,执行的每一行都由某个线程执行。
当您的代码调用 invokeLater()
时,它正在提交 任务 (即一段代码)以由 Swing 的 事件调度执行线程(美国东部时间);当您的代码调用 swingWorker.execute()
时,它正在提交一项任务,由 Swing 的 后台线程之一执行 .
在一个程序中拥有多个线程的全部意义在于它们可以同时做不同的事情。
在你的例子中,你让 EDT 休眠了两秒钟,同时其他线程正在调用 boardLogo.repaint();
和 boardLogo.revalidate();
关于 Swing 和多线程,有一些重要的事情需要了解:
您的所有事件处理程序都将由 EDT 运行。
事件处理程序永远不应执行任何花费超过一秒的时间,因为您的应用程序将无法响应任何其他事件(即,它看起来是 "hung") 直到处理程序 returns.
不允许 其他 线程与任何 Swing 的 GUI 组件交互。
invokeLater()
的一个重要用例是,后台线程中的代码 运行ning 如何与 GUI 组件通信。 invokeLater() 提交一个 task(即一段代码),在 EDT 中将是 运行。
SwingWorker 的主要用例与此相反:事件处理程序 运行ing 在 EDT 中如何启动 任务 这将花费超过一秒的时间才能完成。
您可以通过学习 Swing 并发教程来了解这些内容:https://docs.oracle.com/javase/tutorial/uiswing/concurrency/
我试图让我的 GUI 在图形最近更新后等待 2 秒。这意味着我使用后:
boardLogo.repaint();
boardLogo.revalidate();
我希望 GUI 在进行进一步计算之前等待,然后再次绘制它们。
代码:
SwingUtilities.invokeLater(new Runnable() {
@SuppressWarnings("rawtypes")
@Override
public void run() {
SwingWorker swingWorkerExample = new SwingWorker(){
@Override
protected Object doInBackground() throws Exception {
return null;
}
protected void done(){
try {
Thread.sleep(2000); //wait 2 seconds.
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
swingWorkerExample.execute();
}
});
//.... more code here
boardLogo.repaint();
boardLogo.revalidate();
但是当我 运行 它 - 首先它执行最后两行,然后等待 2 秒...
老实说,我对线程和 Java Swing 的了解不是最好的(尤其是在理解 swing worker 方面,我曾尝试从 Oracle 站点阅读),所以我会如能详细解答,不胜感激
谢谢!
when I run it - first it executes the last two lines, then waits for 2 seconds ... my knowledge about Threads and Java Swing is not the best.
你说,它 执行最后两行。有没有想过它是什么?
它是一个线程。线程是在 Java 程序中执行代码的东西,执行的每一行都由某个线程执行。
当您的代码调用 invokeLater()
时,它正在提交 任务 (即一段代码)以由 Swing 的 事件调度执行线程(美国东部时间);当您的代码调用 swingWorker.execute()
时,它正在提交一项任务,由 Swing 的 后台线程之一执行 .
在一个程序中拥有多个线程的全部意义在于它们可以同时做不同的事情。
在你的例子中,你让 EDT 休眠了两秒钟,同时其他线程正在调用 boardLogo.repaint();
和 boardLogo.revalidate();
关于 Swing 和多线程,有一些重要的事情需要了解:
您的所有事件处理程序都将由 EDT 运行。
事件处理程序永远不应执行任何花费超过一秒的时间,因为您的应用程序将无法响应任何其他事件(即,它看起来是 "hung") 直到处理程序 returns.
不允许 其他 线程与任何 Swing 的 GUI 组件交互。
invokeLater()
的一个重要用例是,后台线程中的代码 运行ning 如何与 GUI 组件通信。 invokeLater() 提交一个 task(即一段代码),在 EDT 中将是 运行。
SwingWorker 的主要用例与此相反:事件处理程序 运行ing 在 EDT 中如何启动 任务 这将花费超过一秒的时间才能完成。
您可以通过学习 Swing 并发教程来了解这些内容:https://docs.oracle.com/javase/tutorial/uiswing/concurrency/