2012-03-08 4 views
1

Я использую DynamicReports библиотека для создания отчетов для моего приложения. Создание отчета занимает некоторое время, и я решил создать пользовательский индикатор выполнения, пока отчеты не были созданы. Вопрос после примеров кода.поток программы java на примере DynamicReports и progressbar

прогресс бар Класс:

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(); 
    } 
} 

Report абстрактный класс

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 library. – Mrusful

+2

В основном модальный диалог блокирует поток до его закрытия. Вы также можете использовать [Swing Worker] (http://java.sun.com/products/jfc/tsc/articles/threads/threads2.html) для выполнения фоновых задач. – Clay3981

+0

Использование примера диалога модального прогресса JDialog имеет белый холст вместо используемого компонента. Также непонятная функция 'Swing'. – Mrusful