2015-02-12 66 views
1

我有一個問題,當設置一個JLabel可見時點擊一個按鈕它就像一個加載圖標。執行p.make()方法,但在方法返回標籤可見後標籤仍然不可見。 有人可以解釋發生了什麼?爲什麼Java不按時間順序執行命令?

的actionPerformed:

String[] args = {jTextFieldDrgzusatzVariable.getText(),jTextFieldAusgabe.getText(),"C:\\CPOracle",jTextFieldKatalog.getText()}; 

this.jLblLoading.setVisible(true); 
if(jLblLoading.isVisible()){ 
     try{ 
     new P21Make(args[0],args[1],args[2],args[3]).make(); 
    }catch(Exception e){ 
     e.printStackTrace(); 
    } 
} 
+1

IOException在p.make()?這是一個新的線程?所有Swing GUI的東西都必須在EDT中完成... – NwDev 2015-02-12 07:54:27

+0

它有350行,所以我認爲這是大 – Zion 2015-02-12 07:54:54

+2

你試過在調用'jLblLoading.revalidate()'和'jLblLoading.repaint()'之後如果? – NwDev 2015-02-12 07:57:41

回答

5

的原因很簡單:Swing是單線程(見Swing concurrency tutorial獲取更多信息)。

會發生什麼情況是,actionPerformed方法被稱爲Swing線程上(在ê(口)d(ispatch)牛逼(hread))。當

this.jLblLoading.setVisible(true); 

聲明已達成,它會立即標記爲jLblLoading可見。但是,這對UI還沒有影響。在可見性改變有任何影響之前,UI需要重新繪製。在EDT上重新計算計劃的(與立即執行的不同)。

這就解釋了爲什麼你

if(jLblLoading.isVisible()){ 

檢查成功,你仍然沒有看到在UI的差異。該組件被標記爲可見,但重繪仍然未決。重新繪製將保持等待,直到EDT再次可用。由於當前佔用EDT的東西是您的actionPerformed調用,因此actionPerformed方法中的其餘代碼將在重繪之前執行(意思是在您看到UI發生變化之前)。

您使用不同線程的解決方案確實可以解決這個問題。但是,只有在new P21Make(...).make()不影響用戶界面的情況下才能使用該功能。如果該語句以任何方式與Swing組件交互,它應該在EDT上執行。在這種情況下,替代方法是將該語句包裝在SwingUtilities#invokeLater調用中。

+0

很好的解釋! – NwDev 2015-02-12 10:24:44