2012-04-07 24 views
1

我已經創造了NetBeans中JDialog和一個自定義的構造函數如下:強制JDialog在處理數據之前變得可見?

public AnimatedProgress(java.awt.Frame parent, boolean modal, JTable table) { 
    super(parent, modal); 
    initComponents(); 
    setLocationRelativeTo(parent); 
    progressLabel.setText("Collecting Table Data. . ."); 
    Object[][] data = getJTableData(table); // Simple method to collect data and store in Object[][] array 
    progressLabel.setText("Processing Data. . ."); 
    processData(data); 
    progressLabel.setText("Data Processed. . ."); 
} 

現在我叫這個JDialog爲:

new AnimatedProgress(this, true, dataTable).setVisible(True); 

我的問題是,作爲Java調用構造函數,所有代碼在構造函數中首先被執行,然後出現對話框並顯示最終結果。

我該如何讓我的JDialog先出現然後再處理方法:getTableData()processData()

+4

不要阻塞EDT(Event Dispatch Thread) - 當發生這種情況時GUI將「凍結」。而不是調用 'Thread.sleep(n)'實現一個Swing'Timer'用於重複執行任務或者一個'SwingWorker'執行長時間運行的任務。 有關更多詳細信息,請參見[併發中的Swing](http://docs.oracle.com/javase/tutorial/uiswing/concurrency/)。 – 2012-04-07 10:26:31

+0

@AndrewThompson - 是的這實際上是主要問題。那麼我知道'swing.Timer'好,但只有兩個過程肯定不會重複,而且我不知道如何在這裏應用'SwingWorker'。 。可以用'SwingWorker'代碼來回答這個問題嗎? – Asif 2012-04-07 10:33:31

+2

@Asif:請不要要求代碼 - 這取決於你創建。爲什麼不看由Andrew Thompson關聯的教程,並嘗試創建自己的代碼。那麼如果你在這裏發佈你的嘗試。 – 2012-04-07 10:39:25

回答

4

下面是一個簡單的使用SwingWorker

public class BackgroundThread extends SwingWorker<Void, Void> 
{ 
    private JTable table; 

    public BackgroundThread(JTable table) 
    { 
     this.table = table; 
    } 

    @Override 
    public Void doInBackground() throws Exception 
    { 
     /* 
      If getJTableData() or processData() are not static, 
      pass a reference of your class which has these methods 
      and call them via that reference 
     */ 
     Object[][] data = getJTableData(table); 
     publish("Processing Data. . ."); 
     processData(data); 
     publish("Data Processed. . ."); 
     return null; 
    } 

    @Override 
    public void process(List<String> chunks) 
    { 
     for(String chunk : chunks) progressLabel.setText(chunk); 
    } 
} 

然後你構造改成這樣:

public AnimatedProgress(java.awt.Frame parent, boolean modal, JTable table) 
{ 
    super(parent, modal); 
    initComponents(); 
    setLocationRelativeTo(parent); 
    setVisible(true); 
    new BackgroundThread(table).execute(); 
} 

我沒有測試它,但我希望它的作品。

+0

非常感謝,我只需要一個結構代碼,因爲你發出:)我會處理錯誤,如果有的話。 。 :) – Asif 2012-04-07 10:53:33

+0

@Asif如果'getJTableData()'或'processData()'在GUI上包含任何更改,請嘗試在'process()'方法中傳遞它,以避免GUI凍結。 – 2012-04-07 11:01:51

+0

我在聲明'process()'方法時得到了這個錯誤:'方法沒有覆蓋或實現一個超類型的方法 BackgroundWrite中的名稱clash:process(java.util.List ) (java.util.List )在javax.swing中。SwingWorker具有相同的擦除,但都不會覆蓋另一個' – Asif 2012-04-07 13:01:56

0

JDialog在創建之前不可見==>構造函數必須在可見性更改之前完全執行。
我想你應該創建一個包含數據填充的myInitialize()方法。 首先,通過調用構造函數來使對話框可見,然後調用myIizeize()方法來填充具有正確數據的組件。

+0

和我應該在哪裏調用這個'myInitialize()'方法? – Asif 2012-04-07 10:44:07

+0

構造函數調用之後。 AnimatedProgress progress = new AnimatedProgress(this,true,dataTable); progress.setVisible(true); progress.init(); – dexametason 2012-04-07 10:44:40

+0

實際上,getTableData()和processData()方法中的整個代碼都是在這個JDailog中自動執行的(我跳過這裏的'Timer'代碼),而且我不能通過事件,我稱之爲'JDialog' ...我希望我對你很清楚:) – Asif 2012-04-07 10:49:32

相關問題