我想這幾個小時..我有一個改變了我的用戶界面,這完全破壞了UI的一個JTextField線程。線程(讓我們稱之爲線程A)由ActionListener生成。 .setText()函數調用位於由線程A創建的額外線程(B)中。線程B是SwingUtilitis.invokeAll()和/或SwingUtilities.invokeAndWait()的參數。我嘗試了他們兩個。這裏有一些代碼使其更加清晰。的Java Swing線程改變UI - 併發症
這是我的ActionListener它創建線程A - 縮短當然:
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,但是一些或者什麼都沒有發生。
而...什麼得到*「搞砸」*? – MadProgrammer
我有一個包含多個較小JPanel的JPanel,它們包含一個圖標和多個JLabels。當函數被調用時,這些JLabel出現在不同的地方,一些完全消失。標籤window.getLbl_Status()與這些沒有任何關係,並且完全在其他地方。該圖標也改變了位置 – user1924422
對標籤值的更改可能會影響其容器和其周圍容器的佈局 – MadProgrammer