Skip to content

Instantly share code, notes, and snippets.

@arleighdickerson
Last active December 10, 2018 20:12
Show Gist options
  • Select an option

  • Save arleighdickerson/0ddb774d234fbe1c69d99241a4e2b22b to your computer and use it in GitHub Desktop.

Select an option

Save arleighdickerson/0ddb774d234fbe1c69d99241a4e2b22b to your computer and use it in GitHub Desktop.
package io.arleigh.reporting;
import java.awt.BorderLayout;
import java.lang.reflect.Field;
import java.util.Locale;
import java.util.ResourceBundle;
import javax.swing.JPanel;
import net.sf.jasperreports.engine.DefaultJasperReportsContext;
import net.sf.jasperreports.engine.JRReport;
import net.sf.jasperreports.engine.JasperReportsContext;
import net.sf.jasperreports.engine.convert.ReportConverter;
import net.sf.jasperreports.engine.design.JasperDesign;
import net.sf.jasperreports.engine.xml.JRXmlLoader;
import net.sf.jasperreports.swing.JRDesignViewer;
import net.sf.jasperreports.view.JasperDesignViewer;
public class DesignViewerHotSwapper {
static final boolean isXML = true;
static final Locale locale = Locale.getDefault();
static final JasperReportsContext jasperReportsContext = DefaultJasperReportsContext
.getInstance();
static final JRViewerController controller = new JRViewerController(
jasperReportsContext,
locale,
null
);
static final String filename = "FirstReport.jrxml";
public static void main(String[] args) {
JRDesignViewer viewer = createJRDesignViewer();
controller.setReport(filename, isXML);
try {
JasperDesignViewer jdv = new JasperDesignViewer(jasperReportsContext, filename, isXML);
Field f = jdv.getClass().getDeclaredField("pnlMain");
f.setAccessible(true);
JPanel panel = (JPanel) f.get(jdv);
panel.remove(panel.getComponents().length - 1);
panel.add(viewer, BorderLayout.CENTER);
jdv.setVisible(true);
new Thread(() -> {
try {
Thread.sleep(1000); // here's the hot reload >>>
controller.loadReport("SecondReport.jrxml", isXML);
controller.reload();
} catch (Throwable t) {
t.printStackTrace();
System.exit(1);
}
}).start();
} catch (Exception e) {
e.printStackTrace();
System.exit(1);
}
}
private static JRDesignViewer createJRDesignViewer() {
try {
return new JRDesignViewer(filename, isXML) {
@Override
protected void initViewerContext(JasperReportsContext jasperReportsContext, Locale locale,
ResourceBundle resBundle) {
this.viewerContext = controller;
setLocale(controller.getLocale());
controller.addListener(this);
}
};
} catch (Exception e) {
e.printStackTrace();
System.exit(1);
}
return null;
}
static class JRViewerController extends net.sf.jasperreports.swing.JRViewerController {
JRViewerController(
JasperReportsContext jasperReportsContext,
Locale locale,
ResourceBundle resBundle
) {
super(jasperReportsContext, locale, resBundle);
this.reloadSupported = true;
}
@Override
public void setReport(String filename, boolean isXmlReport) {
try {
// if (isXmlReport) {
JasperDesign jasperDesign = JRXmlLoader.load(filename);
setReport(jasperDesign);
// } else {
// setReport((JRReport) JRLoader.loadObject(filename));
// }
} catch (Exception e) {
e.printStackTrace();
System.exit(1);
}
}
void setReport(JRReport report) {
this.jasperPrint = new ReportConverter(getJasperReportsContext(), report, false)
.getJasperPrint();
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment