私はこれを何時間も試しました.. 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 も使用してみましたが、一部またはまったく発生しませんでした。