Jasper segnala che i componenti non vengono visualizzati correttamente nel nodo Swing JavaFX


13

Per la creazione di Jasper Report in JavaFX 11 sto usando report dinamici. Sto caricando il report all'interno di Swing Node ma il report Jasper viene visualizzato solo se faccio clic sull'area del riquadro dello stack e tutti gli altri componenti sono visibili solo se passo con il mouse su tutti quei componenti. I componenti e il contenuto del report non vengono caricati all'istante anziché visualizzati al passaggio del mouse e il report viene visualizzato quando si scorre il riquadro dello stack.

Poiché questo era il bug in Java 8 e sembra essere stato risolto, ma anche in Java 11 sto riscontrando lo stesso problema.

Aggiornare

Dal momento che non ricevo alcuna risposta e come suggerito da Kleopatra ho creato un codice riproducibile minimo. Per favore, guarda questo.

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>

Le dipendenze che sto usando sono: -

<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>

Produzione

  1. Dopo aver fatto clic sul pulsante Carica rapporto è visibile solo un'icona di salvataggio, nessun rapporto è visibile. Dopo aver fatto clic sul pulsante Carica rapporto è visibile solo un'icona di salvataggio, nessun rapporto è visibile

  2. Dopo aver fatto clic su Stack Stack Area now, il report è visibile. Dopo aver fatto clic su Area riquadro impilare ora il report è visibile

  3. Dopo aver passato il mouse su un'altra icona ora l'icona Stampa è visibile. Dopo aver passato il mouse sopra un'altra icona ora l'icona Stampa è visibile

  4. Dopo aver passato il mouse sopra anche altre icone, vengono visualizzate una ad una. Dopo aver passato il mouse sopra anche altre icone, vengono visualizzate una ad una


Sto solo ricevendo voti, ma nessuno mi sta rispondendo. Sono davvero alla disperata ricerca di una soluzione a questa domanda.
Satish Pahuja,

3
potresti migliorare le tue possibilità di risposta fornendo un esempio riproducibile minimo (attenzione: non il tuo codice completo, ma un piccolo esempio scritto al solo scopo di dimostrare il tuo problema :)
Kleopatra,

2
e aggiungi tutti i tag pertinenti .. forse qualcuno della folla swing / jasperreport ha alcune informazioni utili
Kleopatra,

1
Ciao, ho eseguito il programma con jbsdk11b125_osx_x64e non sono riuscito a riprodurre il problema. Mostra direttamente il contenuto completo. Anche se ricevo un avviso Caricamento documento FXML con JavaFX API versione 11.0.1 da JavaFX runtime versione 10.0.2-internal ...
Vall0n

2
1) Potrebbe anche essere un problema relativo al driver grafico. Alcune proprietà come punto di partenza per la risoluzione dei problemi docs.oracle.com/en/java/javase/11/troubleshoot/… . 2) Hai provato una versione più recente di org.openjfx:javafx-swing, ad esempio 11? 3) Usando Java 11.0.5, Maven 3.6.2 e plugin org.openjfx:javafx-maven-plugin:0.0.4funziona senza problemi di rendering (il rapporto viene mostrato dopo aver fatto clic sul Load Reportpulsante). L'app viene avviata con mvn clean javafx:run.
Subottimale

Risposte:


1

Dopo aver verificato il wiki OpenJDK per i flag di debug OpenJFX , potresti provare a seguire.

aggiungi nella sezione build pom.xmldell'opzione a JVM per OpenJFX

<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>

eseguire l'app con mvn javafx:runessa riporterà la configurazione Prism rilevata

uscita sul mio sistema

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

sta usando un renderer con accelerazione hardware Loading ES2 native library ... prism_es2

È possibile forzare l'utilizzo del renderer software. Cambia inpom.xml

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

l'output è quindi

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

Sta usando il software di rendering Fallback to Prism SW pipeline.

versioni utilizzate per i test sopra:

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)

Esperto di

Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)

grazie per la condivisione, ma questo approccio non ha risolto il problema.
Satish Pahuja,

1
@SatishPahuja Quale versione concreta di Java java -versionusi? Hai provato a eseguire la versione 11anziché il 11-ea+24plug-in org.openjfx:javafx-swing?
Subottimale
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.