我正在學習Swing並創建了一個示例GUI。我試圖按照精確順序實現以下內容...Swing invokeandwait
- 用戶在某些文本字段中輸入文本。
- 用戶單擊「啓動」按鈕。
- 「啓動」按鈕被禁用。
- 後臺線程產生並處理來自文本字段的文本。
- 後臺線程完成。
- 「啓動」按鈕變爲啓用。
我想使用invokeandwait,如下所示,但我得到「無法從事件調度程序線程調用invokeAndWait」。我的主要方法是在同一個.class文件中,我不太確定「事件分派器線程」到底是什麼。對於這樣的事情最好的辦法是什麼,我需要在我的工作線程中設置某種警報以返回到「事件分派器線程」?
LaunchButton代碼
private void launchButtonActionPerformed(java.awt.event.ActionEvent evt) {
launchButton.setEnabled(false);
try {
java.awt.EventQueue.invokeAndWait(new MyTestThread());
} catch (Exception e) {
}
launchButton.setEnabled(true);
}
工作線程
public class MyTestThread extends Thread {
private int i = 0;
public void run() {
while (i < 5) {
try {
System.out.println(i++);
sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
解
工作線程
public class WorkerThread extends SwingWorker<Integer[], Void> {
@Override
public Integer[] doInBackground() {
System.out.println("Doing in background");
for (int i = 0; i < 5; i++) {
try {
Thread.sleep(1000);
System.out.println("Doing in background" + i);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return null;
}
@Override
public void done() {
System.out.println("Swingworker is Done");
}
}
從我的事件指派線程啓動工作線程(EDT)
new WorkerThread().execute();
不要阻塞EDT(Event Dispatch Thread) - 當發生這種情況時GUI將「凍結」。而不是調用'Thread.sleep(n)'爲長時間運行的任務實現'SwingWorker'。有關更多詳細信息,請參見[Swing中的併發](http://docs.oracle.com/javase/tutorial/uiswing/concurrency/)。 –