显示“正在加载"框架,直到后台进程完成 [英] Display 'Loading' frame until the background process finish
问题描述
我有一个用于打印iReport的按钮,但是显示报告需要花费一些时间,所以我制作了一个名为Loading
的加载框架类
并且我试图在我按下按钮时调用该类,但是它不能正常工作.
I have a button to print iReport but it take time to display the report so I made a loading frame class called Loading
and I am trying to call this class when I press the button but it's not working fine.
我按钮ActionListener
的代码是:
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);
}
}
} `
推荐答案
就像所有与在Swing中执行长时间运行或阻止任务有关的问题一样,请从工作线程和SwingWorker 最多.常见解决方案
Like all questions relating to doing long running or blocking tasks in Swing, start with Concurrency in Swing to better understand the problem you're trying to solve. Next take a look at Worker Threads and SwingWorker for the most common solution
例如:
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;
}
}
然后可以使用类似以下的内容:
Which could then be used something like:
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);
关于基本概念有很多变体,请随时尝试
The are a number of variations around the basic idea, so feel free to experiment
这篇关于显示“正在加载"框架,直到后台进程完成的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!