Java 如何重用或确保一次只存在一个JasperViewer?

Java 如何重用或确保一次只存在一个JasperViewer?,java,jasper-reports,Java,Jasper Reports,我正在创建一个java桌面应用程序。在应用程序中,我使用并基于报告将生成的某些参数生成报告。用户生成第一个报告,然后在jasper查看器中显示。用户最小化jasper查看器并生成下一个报告。然后在新的jasper查看器中查看 因此,每次用户生成报告时,都会创建一个新的jasper查看器。如何重用或确保一次只存在一个JasperViewer JasperPrint print=report.toJasperPrint(); JasperViewer.viewReport(print, false)

我正在创建一个java桌面应用程序。在应用程序中,我使用并基于报告将生成的某些参数生成报告。用户生成第一个报告,然后在jasper查看器中显示。用户最小化jasper查看器并生成下一个报告。然后在新的jasper查看器中查看

因此,每次用户生成报告时,都会创建一个新的jasper查看器。如何重用或确保一次只存在一个JasperViewer

JasperPrint print=report.toJasperPrint();
JasperViewer.viewReport(print, false);
之后,我为jasperviewer创建了一个对象

JasperViewer jv;
 JasperPrint print;
public void action()
{
  button.addActionListener(new ActionListener()
                {
                       @Override
                       public void actionPerformed(ActionEvent e) {
                          try
                          {
                             report.addColumn(...);
                               ...
                               ...
                              print=report.toJasperPrint();
                           jv=new JasperViewer(print,false);
                           jv.setVisible(true);
                          }
                        });
                 }
   }

首先,示例代码不会编译。格式正确后,右括号和分号很快就会出现。它应该是这样的:

JasperViewer jv;
JasperPrint print;
public void action() {
  button.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
      try {
        report.addColumn(...);
        ...
        ...
        print=report.toJasperPrint();
        jv=new JasperViewer(print,false);
        jv.setVisible(true);
      }
    }
  });
}
现在来回答问题
JasperViewer
扩展了
JFrame
,因此任何通过编程关闭它的技巧也应该适用于
JasperViewer
。由于您正在存储对JasperViewer的引用,因此可以检查它是否已经初始化。如果是,则向其发送窗口事件以关闭它

if (jv != null && jv.isVisible()) {
    WindowEvent wev = new WindowEvent(jv, WindowEvent.WINDOW_CLOSING);
    Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(wev);
}