Pour créer un rapport Jasper dans JavaFX 11, j'utilise des rapports dynamiques. Je charge le rapport dans Swing Node mais le rapport Jasper n'apparaît que si je clique sur la zone du volet de pile et sur tous les autres composants visibles uniquement si je survole tous ces composants. Les composants et le contenu du rapport ne se chargent pas instantanément au lieu de s'afficher en survolant la souris et le rapport s'affiche lors du défilement sur le volet de pile.
Comme c'était le bogue dans Java 8 et semble être résolu, mais dans Java 11 aussi, je reçois le même problème.
Mise à jour
Comme je ne reçois aucune réponse et comme suggéré par kleopatra, j'ai créé un code reproductible minimal. Veuillez examiner cela.
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>
Les dépendances que j'utilise sont: -
<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>
Production
Après avoir cliqué sur le bouton de chargement du rapport, une seule icône d'enregistrement est visible, aucun rapport n'est visible.
Après avoir cliqué sur Stack Pane Area, le rapport est désormais visible.
Après avoir survolé une autre icône, l'icône Imprimer est visible.
Après avoir survolé d'autres icônes, elles deviennent visibles une par une.
la source
jbsdk11b125_osx_x64
et je n'ai pas pu reproduire le problème. Il montre directement le contenu complet. Bien que j'obtienne un avertissement Chargement du document FXML avec l'API JavaFX de la version 11.0.1 par le runtime JavaFX de la version 10.0.2-interne ...org.openjfx:javafx-swing
, par exemple11
? 3) En utilisant Java 11.0.5, Maven 3.6.2 et le plugin,org.openjfx:javafx-maven-plugin:0.0.4
cela fonctionne sans problèmes de rendu (le rapport est affiché après avoir cliqué sur leLoad Report
bouton). L'application démarre avecmvn clean javafx:run
.Réponses:
Après avoir vérifié le wiki OpenJDK pour les indicateurs de débogage OpenJFX, vous pouvez essayer de suivre.
ajouter dans la section de construction d'
pom.xml
une option JVM pour OpenJFXexécuter l'application avec
mvn javafx:run
elle signalera la configuration de Prism détectéesortie sur mon système
il utilise un moteur de rendu accéléré
Loading ES2 native library ... prism_es2
Il est possible de forcer l'utilisation du moteur de rendu logiciel. Changement dans le
pom.xml
la sortie est alors
Il utilise le logiciel de rendu
Fallback to Prism SW pipeline
.versions utilisées pour les tests ci-dessus:
JDK
Maven
la source
java -version
utilisez-vous? Avez-vous essayé d'exécuter la version11
au lieu11-ea+24
du pluginorg.openjfx:javafx-swing
?