Zum Erstellen von Jasper Report in JavaFX 11 verwende ich dynamische Berichte. Ich lade einen Bericht in Swing Node, aber der Jasper-Bericht wird nur angezeigt, wenn ich auf den Bereich des Stapelbereichs klicke und alle anderen Komponenten nur sichtbar sind, wenn ich den Mauszeiger über alle diese Komponenten bewege. Komponenten und Berichtsinhalte werden nicht sofort geladen, anstatt beim Bewegen der Maus angezeigt zu werden, und der Bericht wird angezeigt, wenn Sie über den Stapelbereich scrollen.
Da dies der Fehler in Java 8 war und behoben zu sein scheint, bekomme ich auch in Java 11 das gleiche Problem.
Aktualisieren
Da ich keine Antwort bekomme und wie von Kleopatra vorgeschlagen, habe ich nur minimalen reproduzierbaren Code erstellt. Bitte schauen Sie sich das an.
JavaFxJasperReportsDemo.java
package demo;
import java.util.ArrayList;
import java.util.List;
import javax.swing.SwingUtilities;
import javafx.application.Application;
import javafx.application.Platform;
import javafx.embed.swing.SwingNode;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
import javafx.stage.WindowEvent;
import net.sf.dynamicreports.jasper.builder.JasperReportBuilder;
import net.sf.dynamicreports.report.builder.DynamicReports;
import net.sf.dynamicreports.report.builder.column.Columns;
import net.sf.dynamicreports.report.builder.component.Components;
import net.sf.dynamicreports.report.builder.datatype.DataTypes;
import net.sf.dynamicreports.report.constant.HorizontalTextAlignment;
import net.sf.dynamicreports.report.exception.DRException;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.swing.JRViewer;
public class JavaFxJasperReportsDemo extends Application{
@FXML
private StackPane stackPane;
public void start(Stage stage) throws Exception{
try{
System.out.println("Hello");
Parent root = FXMLLoader.load(getClass().getResource("/FXMLJavaFXJasperReportsDemo.fxml"));
Scene scene = new Scene(root);
stage.setScene(scene);
stage.setTitle("Java FX Demo");
stage.show();
stage.setOnCloseRequest(new EventHandler<WindowEvent>() {
public void handle(WindowEvent arg0) {
Platform.exit();
}
});
}
catch (Exception e){
throw e;
}
}
@FXML
public void loadReport(ActionEvent event) {
JasperReportBuilder report = DynamicReports.report();
List<DemoPOJO> lstDemoPOJOs=new ArrayList<DemoPOJO>();
DemoPOJO demoPOJO=new DemoPOJO();
demoPOJO.setName("ABC");
demoPOJO.setCity("Delhi");
lstDemoPOJOs.add(demoPOJO);
demoPOJO = new DemoPOJO();
demoPOJO.setName("XYZ");
demoPOJO.setCity("Agra");
lstDemoPOJOs.add(demoPOJO);
report
.columns(
Columns.columnRowNumberColumn("S No"),
Columns.column("Name", "name", DataTypes.stringType()),
Columns.column("Address", "city", DataTypes.stringType())
).title(
Components.text("Demo Java Fx Jasper Reports").
setHorizontalTextAlignment(HorizontalTextAlignment.CENTER))
.pageFooter(Components.pageXofY())
.setDataSource(lstDemoPOJOs);
try {
JasperPrint jasperPrintReport=report.toJasperPrint();
SwingNode swingNode = new SwingNode();
AnchorPane.setTopAnchor(swingNode,0.0);
AnchorPane.setBottomAnchor(swingNode,0.0);
AnchorPane.setLeftAnchor(swingNode,0.0);
AnchorPane.setRightAnchor(swingNode,0.0);
JRViewer jrViewer= new JRViewer(jasperPrintReport);
SwingUtilities.invokeLater(() ->swingNode.setContent(jrViewer)
);
stackPane.getChildren().add(swingNode);
} catch (DRException e) {
e.printStackTrace();
}
}
public static void main(String[] args){
System.out.println("Hello Main");
try{
launch(args);
}
catch (Exception e){
e.printStackTrace();
}
}
}
DemoPOJO.java
package demo;
public class DemoPOJO {
String name;
String city;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
}
FXMLJavaFXJasperReportsDemo.fxml
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.StackPane?>
<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="561.0" prefWidth="745.0" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="demo.JavaFxJasperReportsDemo">
<children>
<Label layoutX="345.0" layoutY="24.0" text="Java FX Demo Application" />
<StackPane fx:id="stackPane" layoutX="14.0" layoutY="120.0" prefHeight="392.0" prefWidth="722.0" />
<Button layoutX="62.0" layoutY="68.0" mnemonicParsing="false" onAction="#loadReport" text="Load Report" />
</children>
</AnchorPane>
Abhängigkeiten, die ich verwende, sind: -
<dependency>
<groupId>net.sourceforge.dynamicreports</groupId>
<artifactId>dynamicreports-core</artifactId>
<version>6.1.0</version>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-controls</artifactId>
<version>11</version>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-fxml</artifactId>
<version>11</version>
</dependency>
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.2.11</version>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-swing</artifactId>
<version>11-ea+24</version>
</dependency>
Ausgabe
Nach dem Klicken auf die Schaltfläche Bericht laden ist nur ein Speichersymbol sichtbar, kein Bericht ist sichtbar.
Nachdem Sie auf Stapelfensterbereich geklickt haben, wird der Bericht angezeigt.
Nachdem Sie den Mauszeiger über ein anderes Symbol bewegt haben, wird das Drucksymbol angezeigt.
Nachdem Sie den Mauszeiger über andere Symbole bewegt haben, werden diese einzeln angezeigt.
quelle
jbsdk11b125_osx_x64
und konnte das Problem nicht reproduzieren. Es zeigt den gesamten Inhalt direkt. Obwohl ich eine Warnung erhalte Laden eines FXML-Dokuments mit der JavaFX-API der Version 11.0.1 durch die JavaFX-Laufzeit der Version 10.0.2-intern ...org.openjfx:javafx-swing
z11
. 3) Mit Java 11.0.5, Maven 3.6.2 und dem Plugin funktioniertorg.openjfx:javafx-maven-plugin:0.0.4
es ohne Rendering-Probleme (der Bericht wird nach dem Klicken auf dieLoad Report
Schaltfläche angezeigt ). Die App wird mit gestartetmvn clean javafx:run
.Antworten:
Nachdem Sie das OpenJDK-Wiki auf OpenJFX-Debug-Flags überprüft haben, können Sie versuchen, Folgendes zu tun .
pom.xml
Fügen Sie im Build-Abschnitt eine JVM-Option für OpenJFX hinzuWenn Sie die App ausführen
mvn javafx:run
, wird die erkannte Prism-Konfiguration gemeldetAusgabe auf meinem System
Es wird ein hardwarebeschleunigter Renderer verwendet
Loading ES2 native library ... prism_es2
Es ist möglich, die Verwendung des Software-Renderers zu erzwingen. Änderung in der
pom.xml
die Ausgabe ist dann
Es wird der Software-Renderer verwendet
Fallback to Prism SW pipeline
.Versionen, die für die obigen Tests verwendet wurden:
JDK
Maven
quelle
java -version
verwenden Sie? Haben Sie versucht, die Version11
anstelle11-ea+24
des Plugins auszuführenorg.openjfx:javafx-swing
?