2012-04-24 61 views
1

我想在Java中實現一個進度JDialog。我正在解析文件,並且我想在開始解析新文件之後刷新JDialog。我的問題是,JDialog不刷新。我試圖重繪它,或調整它,所以它會重畫。我也嘗試刪除標籤,並添加一個新標籤。創建一個進度條 - 刷新一個JDialog

的ProgressDialog類:

public class ProgressDialog extends javax.swing.JDialog { 
    private JLabel jLabel1; 

    public ProgressDialog(Window frame) { 
     super(frame); 
     this.setResizable(false); 
     this.setLocationRelativeTo(frame); 
     initGUI(); 
     //this.setVisible(true); 

    } 

    private void initGUI() { 
     try { 
      { 
       setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); 
       getContentPane().setLayout(null); 
       { 
        jLabel1 = new JLabel(); 
        getContentPane().add(jLabel1); 
        jLabel1.setText("In Progress.."); 
        jLabel1.setBounds(12, 12, 215, 52); 
        jLabel1.setHorizontalAlignment(SwingConstants.CENTER); 
       } 
      } 
      this.setSize(255, 114); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    public void setText(String s){ 
     this.setVisible(true); 
     jLabel1.setText(s); 
     this.resize(this.getSize()); 
     this.repaint(); 
    } 
} 

我如何使用它:

ProgressDialog pd = new ProgressDialog(frame); 
for(File file:files){ 
    pd.setText("Parsing " + file + "."); 

    ... 

} 

回答

4

您應該在工作線程上執行該文件的解析,並更新Event Dispath線程上的進度對話框。幾個環節值得一讀:

+0

謝謝你的鏈接,我已經實現了它,它工作正常。 – 2012-04-24 19:51:01

3

我猜想你是在美國東部時間執行文件的解析(事件指派線程)。但是調用repaint()實際上會在EventQueue上推送一個事件,該事件將在EDT上的當前調用完成時分派。由於您阻止了EDT,因此只有在執行完所有工作後纔會重新繪製,因此永遠不會看到進度條的刷新/重新繪製。

你應該做的就是使用SwingWorker將你的解析工作放在一個單獨的線程中並且保持EDT不被阻塞。有很多關於如何在SO或Web上使用SwingWorker的例子。

+0

謝謝你的解釋,爲什麼重繪不工作進展的一個例子,它幫了我許多。我用SwingWorker實現了它,並且它工作正常。 – 2012-04-24 19:51:45