Java 带Swingworker的JProgressBar

Java 带Swingworker的JProgressBar,java,swing,jasper-reports,swingworker,jprogressbar,Java,Swing,Jasper Reports,Swingworker,Jprogressbar,我有一个客户机-服务器程序,其中客户机向服务器请求(jasper)报告,并将其显示在屏幕上。 报表获取部分由客户端的Swingworker处理,因为报表可能需要一段时间才能到达(服务器对数据库运行查询等) 下面是我的SwingWorker代码: class ReportFetcher extends SwingWorker<JasperPrint, Void> { private String reportName; public Re

我有一个客户机-服务器程序,其中客户机向服务器请求(jasper)报告,并将其显示在屏幕上。 报表获取部分由客户端的Swingworker处理,因为报表可能需要一段时间才能到达(服务器对数据库运行查询等)

下面是我的SwingWorker代码:

class ReportFetcher extends SwingWorker<JasperPrint, Void> {        
    private String reportName;        
    public ReportFetcher (String reportName) {
        this.reportName = reportName;
    }

    @Override
    protected JasperPrint doInBackground() {
        SocketClient client = new SocketClient(serverAddress, 9999);
        client.sendSignal("Report-" + reportName);
        JasperPrint print = null;
        try {
           print = client.getReport();
           System.out.println("Report fetched : " + reportName);
        } catch (Exception ex) {
           ...            
        }
        client.close();
        return print;       
    }

    @Override
    protected void done()  {
        JasperViewer jv = null;
        try {
             jv = new JasperViewer(get(), false);
        } catch (Exception e) {
            ...
        }
        if (jv != null) {
            jv.setTitle(reportName);
            ...
            jv.setVisible(true);
        }                     
    }      
}
类ReportFetcher扩展SwingWorker{
私有字符串报告名;
公共ReportFetcher(字符串reportName){
this.reportName=reportName;
}
@凌驾
受保护的JasperPrint doInBackground(){
SocketClient=新的SocketClient(服务器地址,9999);
client.sendSignal(“报告-”+reportName);
JasperPrint print=null;
试一试{
print=client.getReport();
System.out.println(“获取的报告:+reportName”);
}捕获(例外情况除外){
...            
}
client.close();
返回打印;
}
@凌驾
受保护的void done(){
JasperViewer jv=null;
试一试{
jv=新JasperViewer(get(),false);
}捕获(例外e){
...
}
如果(jv!=null){
合资企业名称(报告名称);
...
jv.setVisible(真实);
}                     
}      
}
在上面的代码中,客户端的整个耗时代码只是一个方法调用:
print=client.getReport()

那么,在这种情况下,是否可以使用进度条呢?(即没有进展的中间迹象)?有什么建议吗?

你可以听听客户的进度。如果更强的耦合不是一个问题,您也可以从客户端获得一个进度条。当您在服务器端执行一些耗时的步骤(例如,您运行多个DB查询)时,您可以启动线程(当然是服务器端)并从客户端轮询其状态。@Sergiy服务器端不是也会出现同样的问题吗?我的意思是,如何从java中获得运行DB查询的进度?@funkyjelly你是对的,对于单个查询来说是不可能的。但有些报告需要不止一个查询,在某些情况下,还需要时间来生成报告。在这种情况下,您可以显示一个进度条,它真正显示了进度。只有一个耗时的操作(DB查询)是不可能的。@funkyjelly 1。我会考虑在启动客户端应用程序之前加载所有报告。您还可以创建一种demon\服务,用于永久检查客户端报告模板是否最新。2.如果p1。不是您可以收集一些指标并将其存储在客户端的选项。例如,您可以测量方法getReport()avg.running time,在本地存储/更新该值,并使用它显示进度条。您可以监听客户端的进度。如果更强的耦合不是一个问题,您也可以从客户端获得一个进度条。当您在服务器端执行一些耗时的步骤(例如,您运行多个DB查询)时,您可以启动线程(当然是服务器端)并从客户端轮询其状态。@Sergiy服务器端不是也会出现同样的问题吗?我的意思是,如何从java中获得运行DB查询的进度?@funkyjelly你是对的,对于单个查询来说是不可能的。但有些报告需要不止一个查询,在某些情况下,还需要时间来生成报告。在这种情况下,您可以显示一个进度条,它真正显示了进度。只有一个耗时的操作(DB查询)是不可能的。@funkyjelly 1。我会考虑在启动客户端应用程序之前加载所有报告。您还可以创建一种demon\服务,用于永久检查客户端报告模板是否最新。2.如果p1。不是您可以收集一些指标并将其存储在客户端的选项。例如,您可以测量方法getReport()avg.running time,在本地存储/更新该值,并使用它显示进度条。