2012-09-14 73 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中执行的另一个方法中的循环后的代码,现在它可以工作。