2012-09-14 72 views
1

我有一個帶有CardLayout組件的JFrame。我使用CardLayout在應用程序執行的不同時刻在不同的JPanel之間切換。在某些時候,我使用SwingWorker對象來生成一些XML文件。在這個時候,我想在我的窗口中顯示另一個JPanel來告訴用戶等待。在這個JPanel上,我想在3個標籤之間切換。更新JFrame中的JPanel

  • JLabel 1將是:「請稍等。」
  • 的JLabel 2將是: 「請稍候。」
  • 的JLabel 3是: 「請稍候...」

現在的代碼如下所示:

 ConvertersWorker.execute(); 
     CLayout.show(Cards, WAIT_PANEL); 


     Timer t =new Timer(500, new ActionListener() 
     { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       WaitPanel.SwitchLabels(); 
      }    
     }); 
     t.start(); 

     while (!this.finishedConverting) 
     { 

     } 
     //After this im am executing other methods based on the generated XML files 

SwingWorker代碼:

SwingWorker<Boolean, Void> ConvertersWorker = new SwingWorker<Boolean, Void>() { 
    public Boolean doInBackground() { 
     Boolean result = RunConverters(); 
     return result; 
    } 
    public void done() { 
     try { 
      finishedConverting = get(); 
     } catch (InterruptedException ex) { 
      ex.printStackTrace(); 
     } catch (ExecutionException ex) { 
      ex.printStackTrace(); 
     } 
    } 
} ; 

第二個JPanel甚至沒有顯示,因爲JFrame塊。它因爲while循環而被阻塞,但我不知道如何以不同的方式實現它。並且SwingWorker的done()方法也不會執行。如果它被執行,那麼finishedConverting變量將被設置爲true,並且while循環將停止。任何人都可以幫助我找到更好的解決方案嗎?

回答

1

我知道你解決了這一點,但發生的事情,因爲你只用一個thread,它阻止,因爲While的,所以你需要創建一個新的thread來處理這個

new Thread(){ 
    public void run() { 
    //code here 
    } 
}.start(); 

,並刷新一個JPanel的內容,您可以使用

myJpanel.doLayout(); 

myJpanel.repaint(); 
+0

謝謝你的回答。 – Mike

0

我刪除了while循環,並移動了在done()方法SwingWorker中執行的另一個方法中的循環後的代碼,現在它可以工作。