Jasper meldet, dass Komponenten in JavaFX Swing Node nicht richtig gerendert werden

13

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

  1. Nach dem Klicken auf die Schaltfläche Bericht laden ist nur ein Speichersymbol sichtbar, kein Bericht ist sichtbar. Nach dem Klicken auf die Schaltfläche Bericht laden ist nur ein Speichersymbol sichtbar, kein Bericht ist sichtbar

  2. Nachdem Sie auf Stapelfensterbereich geklickt haben, wird der Bericht angezeigt. Nachdem Sie auf Stapelfensterbereich geklickt haben, wird der Bericht angezeigt

  3. Nachdem Sie den Mauszeiger über ein anderes Symbol bewegt haben, wird das Drucksymbol angezeigt. Nachdem Sie den Mauszeiger über ein anderes Symbol bewegt haben, wird das Drucksymbol angezeigt

  4. Nachdem Sie den Mauszeiger über andere Symbole bewegt haben, werden diese einzeln angezeigt. Nachdem Sie den Mauszeiger über andere Symbole bewegt haben, werden diese einzeln angezeigt

Satish Pahuja
quelle
Ich bekomme nur positive Stimmen, aber niemand gibt mir eine Antwort. Ich bin sehr verzweifelt, eine Lösung für diese Frage zu finden.
Satish Pahuja
3
Sie könnten Ihre Chancen auf eine Antwort verbessern, indem Sie ein minimal reproduzierbares Beispiel
angeben
2
und füge alle relevanten Tags hinzu. Vielleicht hat jemand aus der Swing / Jasperreport-Menge hilfreiche Einblicke
Kleopatra
1
Hallo, ich habe das Programm mit ausgeführt jbsdk11b125_osx_x64und 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 ...
Vall0n
2
1) Möglicherweise handelt es sich auch um ein Problem mit dem Grafiktreiber. Einige Eigenschaften als Ausgangspunkt für die Fehlerbehebung bei docs.oracle.com/de/java/javase/11/troubleshoot/… . 2) Haben Sie eine neuere Release-Version von org.openjfx:javafx-swingz 11. 3) Mit Java 11.0.5, Maven 3.6.2 und dem Plugin funktioniert org.openjfx:javafx-maven-plugin:0.0.4es ohne Rendering-Probleme (der Bericht wird nach dem Klicken auf die Load ReportSchaltfläche angezeigt ). Die App wird mit gestartet mvn clean javafx:run.
SubOptimal

Antworten:

1

Nachdem Sie das OpenJDK-Wiki auf OpenJFX-Debug-Flags überprüft haben, können Sie versuchen, Folgendes zu tun .

pom.xmlFügen Sie im Build-Abschnitt eine JVM-Option für OpenJFX hinzu

<plugin>
    <groupId>org.openjfx</groupId>
    <artifactId>javafx-maven-plugin</artifactId>
    <version>0.0.4</version>
    <configuration>
        <mainClass>demo.JavaFxJasperReportsDemo</mainClass>
        <options>
            <option>-Dprism.verbose=true</option>
        </options>
    </configuration>
</plugin>

Wenn Sie die App ausführen mvn javafx:run, wird die erkannte Prism-Konfiguration gemeldet

Ausgabe auf meinem System

Prism pipeline init order: es2 sw 
Using Double Precision Marlin Rasterizer
Using dirty region optimizations
Not using texture mask for primitives
Not forcing power of 2 sizes for textures
Using hardware CLAMP_TO_ZERO mode
Opting in for HiDPI pixel scaling
Prism pipeline name = com.sun.prism.es2.ES2Pipeline
Loading ES2 native library ... prism_es2
    succeeded.
GLFactory using com.sun.prism.es2.X11GLFactory
(X) Got class = class com.sun.prism.es2.ES2Pipeline
Initialized prism pipeline: com.sun.prism.es2.ES2Pipeline
...
Graphics Vendor: Intel Open Source Technology Center
       Renderer: Mesa DRI Intel(R) Ivybridge Mobile 
        Version: 3.0 Mesa 19.3.2

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 derpom.xml

        <options>
            <option>-Dprism.verbose=true</option>
            <option>-Dprism.order=sw</option
        </options>

die Ausgabe ist dann

Prism pipeline init order: sw 
Using Double Precision Marlin Rasterizer
Using dirty region optimizations
Not using texture mask for primitives
Not forcing power of 2 sizes for textures
Using hardware CLAMP_TO_ZERO mode
Opting in for HiDPI pixel scaling
*** Fallback to Prism SW pipeline
Prism pipeline name = com.sun.prism.sw.SWPipeline
(X) Got class = class com.sun.prism.sw.SWPipeline
Initialized prism pipeline: com.sun.prism.sw.SWPipeline
 vsync: true vpipe: false

Es wird der Software-Renderer verwendet Fallback to Prism SW pipeline.

Versionen, die für die obigen Tests verwendet wurden:

JDK

java version "11.0.2" 2019-01-15 LTS
Java(TM) SE Runtime Environment 18.9 (build 11.0.2+9-LTS)
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.2+9-LTS, mixed mode)

Maven

Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)
Suboptimal
quelle
Vielen Dank für das Teilen, aber dieser Ansatz hat das Problem nicht gelöst.
Satish Pahuja
1
@ SatishPahuja Welche konkrete Java-Version java -versionverwenden Sie? Haben Sie versucht, die Version 11anstelle 11-ea+24des Plugins auszuführen org.openjfx:javafx-swing?
SubOptimal