2013-12-13 22 views
0

我有一個Jlabel數組,每個都有一個imageIcon連接到它。附件發生在構造函數之外的方法中,這個方法被多次調用,並且在方法結束時我使用了repaint()。JLabel with Image不會從屏幕上擦除

的問題是,經過certin的JLabel一直平局,我不能讓他「拉開,即使我改變的JLabel(或圖像)爲空。是似乎只是呆在那裏。

我試圖再次重畫,重新設置背景顏色和重新驗證,與非看起來做的工作

任何想法

編輯:?我嘗試以下(在美國東部時間內)和它似乎只改變陣列上的最後一個JLable:

for (int j = 0;j<playerCards.length;j++){ 
    remove(playerCards[j]); 
} 
+0

你的代碼是錯誤的,因爲你沒有發佈你的'SSCCE'來證明問題,所以我們不能幫忙。 setIcon()方法將起作用。您甚至不需要使用repaint(),因爲該標籤足夠聰明,可以在其中一個屬性發生更改時重新繪製它自己。 – camickr

+0

你在父容器上使用'remove()'嗎?我不知道將「JLabel」更改爲「null」是什麼意思;如果你說,例如'JLabel [] arr;'和後來'arr [i] = null;',這對GUI沒有任何影響(我不知道任何Swing組件會關心你的'JLabel []'數組)。 – ajb

回答

2

嘗試將您的UI操作移動到EDT線程中。不讓他們在那裏可能會導致不可預知的結果。

EDT - 事件分派線程

您應該使用EDT線程更改GUI所以這是進行更改的唯一線索。

SwingUtilities.invokeLater( 
     new Runnable() { 
      public void run() { 
       //UI changes here 
      } 
     } 
    ); 
+1

即使我在主線上做了所有的修飾,它是否也是必要的? –

+0

是的,因爲除您自己以外的任何其他線程(包括那些可能做你不知道的東西的EDT)所做的其他任何更新都將來自第二個線程,所以最好只做所有的UI調整線程也。 –

+2

@SaharZehavi,定義「主線程」。如果您正在從偵聽器執行代碼,那麼該代碼會自動在EDT上執行。如果你正在創建一個自定義線程,那麼你需要使用invokeLater()。你的問題太模糊了,很難回答,所以你需要發佈SSCCE。 – camickr

-2

嘗試使用

SwingUtilities.updateComponentTreeUI(YOUR_OBJECT_CONTAINER); 

其中YOUR_OBJECT_CONTAINER是擴展JComponent的包含一個JLabel要刪除的Java對象。

+2

-1,這不是一個合適的建議。該方法用於LAF更改。 Swing組件足夠聰明,可以在屬性更改時重新繪製自己。 – camickr