我尝试了很多小时。我有一个线程可以更改我的 UI 的 JTextField,这完全破坏了 UI。线程(我们称之为线程 A)由 ActionListener 生成。.setText() 函数调用在线程 A 创建的额外线程 (B) 中。线程 B 是 SwingUtilitis.invokeAll() 和/或 SwingUtilities.invokeAndWait() 的参数。我都试过了。这里有一些代码让它更清楚。
这是我创建线程 A 的 ActionListener - 当然缩短了:
public void actionPerformed(ActionEvent evt) {
Object source = evt.getSource();
if (source == window.getBtn_Search()) {
Refresher refresh = new Refresher();
refresh.start();
}
}
这是我的线程 A,稍后将线程 B 放入 EDT 队列:
public class Refresher extends Thread implements Runnable {
private int counter = 0;
private UI window = null;
private int defRefresh = 0;
@Override
public void run() {
while(true){
-bazillion lines of code-
do {
try {
Refresher.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
if(window.canceled()) break;
UI.updateCounter(window.getLbl_Status(), (Configuration.getRefreshTime()-counter));
counter++;
} while (counter <= Configuration.getRefreshTime());
- more code-
}
}
}
UI.updateCounter(...) 将线程 B 排队到 EDT。
public static void updateCounter(final JLabel label, final int i) {
try {
SwingUtilities.invokeAndWait(
new Runnable() {
public void run() {
label.setText("Refreshing in: " + i + " seconds.");
}
}
);
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
现在,当最后一个函数被调用时,一切都搞砸了。我尝试了几个小时不同的东西,但没有任何效果。我也尝试过使用 SwingWorker,但有些或根本没有发生。