Jasper Reports Components no se procesa correctamente en JavaFX Swing Node

13

Para crear Jasper Report en JavaFX 11 estoy usando informes dinámicos. Estoy cargando el informe dentro del Nodo Swing, pero el informe de Jasper aparece solo si hago clic en el área del panel de la pila y en todos los demás componentes visibles solo si paso el mouse sobre todos esos componentes. Los componentes y el contenido del informe no se cargan instantáneamente en lugar de mostrarse al pasar el mouse por encima y el informe se muestra al desplazarse por el Panel de pila.

Como este fue el error en Java 8 y parece estar resuelto, pero en Java 11 también estoy teniendo el mismo problema.

Actualizar

Como no recibo ninguna respuesta y, como lo sugiere kleopatra, he creado un código reproducible mínimo. Por favor mira esto.

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>

Las dependencias que estoy usando son: -

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

Salida

  1. Después de hacer clic en el botón cargar informe, solo se ve un icono de guardar, no hay ningún informe visible. Después de hacer clic en el botón cargar informe, solo se ve un icono de guardar, no hay informe visible

  2. Después de hacer clic en el área del panel de pila, ahora el informe es visible. Después de hacer clic en el área del panel de pila, ahora el informe es visible

  3. Después de pasar el mouse sobre otro ícono, ahora el ícono Imprimir está visible. Después de pasar el mouse sobre otro ícono, ahora el ícono Imprimir está visible

  4. Después de pasar el mouse sobre otros íconos, también se vuelven visibles uno por uno. Después de pasar el mouse sobre otros íconos, también se vuelven visibles uno por uno

Satish Pahuja
fuente
Recién estoy recibiendo votos, pero nadie me da una respuesta. Estoy muy desesperado por encontrar alguna solución a esta pregunta.
Satish Pahuja
3
puede mejorar sus posibilidades de obtener una respuesta al proporcionar un ejemplo reproducible mínimo (mente: no es su código completo, sino un pequeño ejemplo escrito con el único propósito de demostrar su problema :)
kleopatra
2
y añadir todas las etiquetas correspondientes .. tal vez alguien de la multitud de oscilación / JasperReport tiene alguna información útil
kleopatra
1
Hola, he ejecutado el programa jbsdk11b125_osx_x64y no he podido reproducir el problema. Muestra el contenido completo directamente. Aunque recibo una advertencia Cargando documento FXML con JavaFX API de la versión 11.0.1 por JavaFX runtime de la versión 10.0.2-internal ...
Vall0n
2
1) También podría ser un problema relacionado con el controlador de gráficos. Algunas propiedades como punto de partida para la solución de problemas docs.oracle.com/en/java/javase/11/troubleshoot/… . 2) ¿Has probado una versión de lanzamiento más reciente de org.openjfx:javafx-swing, por ejemplo 11? 3) Utilizando Java 11.0.5, Maven 3.6.2 y el complemento org.openjfx:javafx-maven-plugin:0.0.4, funciona sin problemas de representación (el informe se muestra después de hacer clic en el Load Reportbotón). La aplicación se inicia con mvn clean javafx:run.
SubOptimal

Respuestas:

1

Después de consultar el wiki de OpenJDK para ver los indicadores de depuración de OpenJFX , puede intentar seguir.

agregar en la sección de compilación de la pom.xmlopción JVM para 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>

ejecutar la aplicación con mvn javafx:runella informará la configuración de Prism detectada

salida en mi 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

está usando un renderizador acelerado por hardware Loading ES2 native library ... prism_es2

Es posible forzar el uso del procesador de software. Cambio en elpom.xml

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

la salida es entonces

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

Está utilizando el procesador de software Fallback to Prism SW pipeline.

versiones utilizadas para las pruebas anteriores:

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)
Subóptimo
fuente
gracias por compartir, pero este enfoque no resolvió el problema.
Satish Pahuja
1
@SatishPahuja ¿Qué versión concreta de Java java -versionutilizas? ¿Has intentado ejecutar la versión en 11lugar 11-ea+24de plugin org.openjfx:javafx-swing?
Subóptimo