2012-03-08 10 views
1

私はDynamicReportsライブラリを使用して、自分のアプリケーションのレポートを作成します。レポートの作成にはしばらく時間がかかり、レポートが作成されていない間はカスタム進行状況バーを作成することにしました。コード例の後の質問。DynamicReportsとprogressbarの例のJavaプログラムフロー

プログレスバークラス:

public class ProgressDialog implements DialogWrapper{ 

    private JFrame iFrame; 
    private JDialog iDialog; 
    private JPanel pane; 
    private final JProgressBar aJProgressBar = new JProgressBar(0, 100); 

    public ProgressDialog(){ 
     onCreate(); 
    } 

    @Override 
    public void onCreate() { 
     iFrame = new JFrame("Создание отчета"); 
     iDialog = new JDialog(iFrame, true); 
     pane = new JPanel(); 
     aJProgressBar.setIndeterminate(true); 
     pane.add(aJProgressBar, BorderLayout.NORTH); 
     iDialog.add(pane, BorderLayout.CENTER); 
     iDialog.setTitle("Создание отчета"); 
     iDialog.setSize(300, 150); 
     iDialog.setResizable(false); 
     iDialog.setVisible(true); 
     return; 
    } 

    @Override 
    public void fillData() {} 

    @Override 
    public void onSubmit() {} 

    protected void onCancel(){ 
     iDialog.setVisible(false); 
     iDialog.dispose(); 
    } 

    public void cancel(){ 
     onCancel(); 
    } 
} 

レポート抽象クラス

public abstract class AbstractReportMain<T extends ReportDesign<U>, U extends ReportData> { 
private ProgressDialog pd; 

public AbstractReportMain() { 
    pd = new ProgressDialog(); 
    build(); 
} 

protected void build() { 
    try { 
     JasperReportBuilder reportBuilder = DynamicReports.report();    
     U data = getReportData(); 
     if (data != null) { 
      reportBuilder.setDataSource(data.createDataSource()); 
     } 
     getReportDesign().configureReport(reportBuilder, data); 

     pd.cancel(); 
     reportBuilder.show(false); 
    } catch (DRException e) { 
     e.printStackTrace();  
    } 
} 

protected U getReportData() { 
    return null; 
} 

protected abstract T getReportDesign(); 
} 

質問:私は、ProgressDialogを作成するときに、私は近くに対話をしませんが、プログラムの流れが停止します。それがなぜ起こったのですか、この行動がどのように呼び出され、どこでそれについて読むことができるのですか?どのようにそれを使用して、それは私のために動作します。ありがとう。

答えて

2

あなたの問題は、進捗ダイアログの新しいスレッドを作成していないと思います。あなたに役立つ例がここにあります。 Modal Progress Dialog example

+0

はい新しいスレッドが問題を解決します。しかし、アプリケーションの流れがダイアログウィンドウに残っているのは正常ですか?私はこれに驚いた。私はJavaのuiライブラリで新しいです。 – Mrusful

+2

基本的にモーダルダイアログはスレッドが閉じられるまでブロックします。 [Swing Worker](http://java.sun.com/products/jfc/tsc/articles/threads/threads2.html)を使用して、バックグラウンドタスクを実行することもできます。 – Clay3981

+0

'Modal Progress Dialog example'を使うJDialogはコンポーネントを使う代わりに白いキャンバスを持っています。 'Swing'の明確な特徴もありません。 – Mrusful