2012-12-09 87 views
0

我有我添加JLabel的到一個JPanel。然後我想刪除所有JLabel並添加一些新的JLabel。重新驗證並重新繪製 - 的Java Swing

所以我做到以下幾點:

 panel.removeAll();panel.repaint(); 

     panel.add(new JLabel("Add something new"); 

     panel.revalidate(); 

這工作得很好。

panel.removeAll();panel.repaint(); 

    (1)panel.add(new JLabel("Add something new"); 

    panel.revalidate(); 

    //new thread to start - this thread creates new JLabels that should appear under (1) 
    firstProducer.start();    

    try { 

      firstProducer.join(); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

然後從原始的JLabel輸出仍是可見:當我在這之後就像啓動一個新線程我的問題就出現了。我已經讀過,重新驗證過程是一個長時間運行的任務,因此第一個生產者線程正在啓​​動,而 重新驗證正在進行並且發生衝突。處理這個問題的最佳方法是什麼?

+0

同步問題? –

+1

1)*「我有一個JPanel,我正在添加JLabel的。」*爲什麼?在圖形用戶界面中使用''「'標籤將使它們更易於使用,但是不可見。 2)確保長時間運行的操作離開EDT,GUI更新。爲長時間運行的任務實現'SwingWorker'。有關更多詳細信息,請參見[Swing中的併發](http://docs.oracle.com/javase/tutorial/uiswing/concurrency/)。 –

+0

歡呼的提示 –

回答

4

問題是firstProducer.join。如javadoc中所述

等待此線程死亡。

所以你卡住事件指派線程,直到你的其他Thread完成,因此面板不能粉刷,也沒有重新驗證,你不會看到用戶界面中的變化。

有關更多信息,請參閱Swing concurrency tutorial

+0

謝謝..將做... –