当前位置: 首页 > 面试题库 >

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

鱼征
2023-03-14
问题内容

我有一个用于打印iReport的按钮,但是显示报告需要花费一些时间,因此我创建了一个称为“加载框架”的类Loading
,当我按下按钮时,我试图调用该类,但是它不能正常工作。

我的按钮代码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中执行长时间运行或阻塞任务有关的问题一样,从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);

这些是围绕基本概念的多种变体,请随时尝试



 类似资料:
  • 问题内容: 我想向用户显示一个加载图标,直到页面元素完全加载为止。如何使用javascript做到这一点,而我想使用javascript而不是jquery做到这一点? 这是一个链接,谷歌是怎么做到的?在onload事件或类似事件上触发某些功能..我知道它会以这种方式或任何其他方式完成?还是有一些事件吗? 更新 我使用显示属性做了一些操作,我隐藏了body元素,但是body标签的onload更改了它

  • 问题内容: 我显示了在Ajax调用之前和Ajax调用之后加载DOM的过程,我将其隐藏。由于某些原因,加载图像仅在ajax调用完成之后出现。结果是,除非我输入以下内容,否则加载图像甚至都不会出现。代码如下: 我已经在我的网站上的其他Ajax调用上进行了测试,并且发生了相同的问题。有人解决过这个吗?我正在使用Chrome 26。 编辑:我忘记指定我正在使用 同步 ajax调用。() 问题答案: 这取决

  • 问题内容: 我的网站上有一个版块,在进行一些密集的通话时加载速度很慢。 知道如何div在页面准备时显示类似于“加载”的内容,然后在一切准备就绪时消失吗? 问题答案: 我需要这个,经过一番研究,我想到了这个(需要jQuery): 首先,在标签之后添加以下代码: 然后将div和图片的样式类添加到CSS: 然后,将此JavaScript添加到您的页面中(当然,最好在页面结尾处,在结束

  • 问题内容: 在数据完成加载之前,如何使AngularJS显示加载微调框? 如果我的控制器是静态设置的,并且填充了AJAX加载器,我希望微调器显示直到AJAX加载完成,然后使用检索到的数据填充绑定范围。 此代码立即填充绑定范围,并且如果为空,则微调框将被替换为空。 我应该如何干净地做这件事? 问题答案: 我会根据其他答案创建一个自定义指令,但是这是没有指令的情况下如何实现的,这可能是在进入更复杂的功

  • 在退出脚本(TCL/Bash)之前,如何确保所有后台进程都已完成执行。 我想把我所有的后台进程PID写到一个pidfile中。然后在最后pgrep PID file,看看在我退出之前是否还有进程在运行。 有什么更简单的方法吗?而TCL有没有具体的办法做到这一点呢?

  • 我最初的fxml(例如)有很多功能,因此完全加载需要大量时间。因此,为了避免程序启动和fxml加载之间的时间间隔,我引入了另外一个fxml()和一个gif图像,该图像应该在加载主fxml时出现。问题是我的加载器中的gif图像。fxml不会移动,就像程序中的挂起一样,直到home.fxml被完全加载。为了避免这种情况,我将home.fxml加载移到一个线程中,如下代码所示。 但是在这段代码之后,我的