就像所有与在Swing中执行长时间运行或阻塞任务有关的问题一样,从Swing中的并发开始,以更好地了解您要解决的问题。接下来看看最常见的解决方案Worker
Threads和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);这些是围绕基本概念的多种变体,请随时尝试



