且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

显示“正在加载"框架,直到后台进程完成

更新时间:2023-12-05 17:33:58

就像所有与在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