2017-05-04 12 views
0

iReportを印刷するボタンがありますが、レポートを表示するのに時間がかかるので、Loading というローディングフレームクラスを作成しました。ボタンが動作していません。バックグラウンドプロセスが終了するまで 'Loading'フレームを表示する

ボタンActionListenerのための私のコードは次のとおりです。長時間実行を行うか、Swingでタスクをブロックに関連するすべての質問と同様に

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {           
    loading.setVisible(true);// show frame before trying to connect to database and load report 
    try { 
     String reportquery = "Select * from invoices "; 
     JasperDesign jasperdesign = JRXmlLoader.load("StatementReport.jrxml"); 
     JRDesignQuery designquery = new JRDesignQuery(); 
     designquery.setText(reportquery); 
     jasperdesign.setQuery(designquery); 
     JasperReport jasperreport = JasperCompileManager.compileReport(jasperdesign); 
     JasperPrint jasperprint = JasperFillManager.fillReport(jasperreport, null, con); 

     JasperViewer.viewReport(jasperprint, false); 

    } catch (JRException e) { 
     JOptionPane.showMessageDialog(this, e); 
    } finally { 
     try { 
      rs.close(); 
      pst.close(); 
      loading.dispose(); // dispose loading frame when finish 
     } catch (SQLException ex) { 
      Logger.getLogger(showAllInvoices.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 
} ` 
+1

1)EDT(Event Dispatch Thread)をブロックしないでください。それが起こると、GUIは「フリーズ」します。詳細と修正については、[Swingの同時実行性](https://docs.oracle.com/javase/tutorial/uiswing/concurrency/)を参照してください。 2)「複数のJFramesの使い方、良い/悪い習慣」(http://stackoverflow.com/q/9554636/418556)を参照してください。これは 'JDialog'に適しているようです。 –

+0

'jDialog'を追加しますが、レポートの後に表示されます ' jDialog.setLayout(new GridBagLayout()); jDialog.add(新しいJLabel(「しばらくお待ちください...」)); jDialog.setMinimumSize(新しい寸法(150,50)); jDialog.setResizable(false); jDialog.setModal(false); jDialog.setUndecorated(true); jDialog.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); jDialog.setLocationRelativeTo(null); jDialog.setVisible(true); '@AndrewThompson –

+1

1)コードをコメントに入れないでください。コメントは事実上読めません。 2)重要な示唆は、「JDialog」に関する*前*であった。この場合、ダイアログを使用しても、何が壊れているか(EDTをブロックする)は修正されません。 –

答えて

2

、より良いあなたが解決しようとしている問題を理解するためにConcurrency in Swingで始まります。次たとえば、最も一般的な解決策

ためWorker Threads and SwingWorkerを見てみましょう:

、その後のようなものを使用することができ
public static class JasperReportsWorker extends SwingWorker<JasperReport, JasperReport> { 

    @Override 
    protected JasperReport doInBackground() throws Exception { 
     JasperReport report = null; 
     try { 
      String reportquery = "Select * from invoices "; 
      JasperDesign jasperdesign = JRXmlLoader.load("StatementReport.jrxml"); 
      JRDesignQuery designquery = new JRDesignQuery(); 
      designquery.setText(reportquery); 
      jasperdesign.setQuery(designquery); 
      report = JasperCompileManager.compileReport(jasperdesign); 
     } finally { 
      try { 
       rs.close(); 
       pst.close(); 
      } catch (SQLException ex) { 
       ex.printStackTrace(); 
      } 
     } 
     return report; 
    } 

} 

:ザ・基本的な考え方の周りのバリエーションの数です

JasperReportsWorker worker = new JasperReportsWorker(); 
JDialog dialog = new JDialog(); 
dialog.setModal(true); 
dialog.add(new JLabel("Working...")); 
dialog.pack(); 
dialog.setLocationRelativeTo(null); 
worker.addPropertyChangeListener(new PropertyChangeListener() { 
    @Override 
    public void propertyChange(PropertyChangeEvent evt) { 
     String name = evt.getPropertyName(); 
     JasperReportsWorker worker = (JasperReportsWorker) evt.getSource(); 
     if ("state".equalsIgnoreCase(name)) { 
      switch (worker.getState()) { 
       case DONE: 
        if (dialog != null) { 
         dialog.setVisible(false); 
        } 
        try { 
         JasperReport report = worker.get(); 
         JasperPrint jasperprint = JasperFillManager.fillReport(jasperreport, null, con); 
         JasperViewer.viewReport(jasperprint, false); 
        } catch (InterruptedException | ExecutionException ex) { 
         ex.printStackTrace(); 
        } 
        break; 
      } 
     } 
    } 
}); 
worker.execute(); 
dialog.setVisible(true); 

をので、自由に実験してください。

関連する問題