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)EDT(Event Dispatch Thread)をブロックしないでください。それが起こると、GUIは「フリーズ」します。詳細と修正については、[Swingの同時実行性](https://docs.oracle.com/javase/tutorial/uiswing/concurrency/)を参照してください。 2)「複数のJFramesの使い方、良い/悪い習慣」(http://stackoverflow.com/q/9554636/418556)を参照してください。これは 'JDialog'に適しているようです。 –
'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)コードをコメントに入れないでください。コメントは事実上読めません。 2)重要な示唆は、「JDialog」に関する*前*であった。この場合、ダイアログを使用しても、何が壊れているか(EDTをブロックする)は修正されません。 –