Les composants de Jasper Reports ne s'affichent pas correctement dans le nœud pivotant JavaFX

13

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

  1. 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 le bouton Charger le rapport, une seule icône d'enregistrement est visible, aucun rapport n'est visible

  2. Après avoir cliqué sur Stack Pane Area, le rapport est désormais visible. Après avoir cliqué sur Stack Pane Area, le rapport est maintenant visible

  3. Après avoir survolé une autre icône, l'icône Imprimer est visible. Après avoir survolé une autre icône, l'icône Imprimer est visible

  4. Après avoir survolé d'autres icônes, elles deviennent visibles une par une. Après avoir survolé d'autres icônes, elles deviennent visibles une par une

Satish Pahuja
la source
Je reçois juste des votes positifs mais personne ne me donne de réponse. Je désire ardemment trouver une solution à cette question.
Satish Pahuja
3
vous pourriez améliorer vos chances de réponse en fournissant un exemple reproductible minimal (attention: pas votre code complet, mais un petit exemple écrit dans le seul but de démontrer votre problème :)
kleopatra
2
et ajoutez toutes les balises pertinentes .. peut-être que quelqu'un de la foule swing / jasperreport a des informations utiles
kleopatra
1
Salut, j'ai exécuté le programme avec jbsdk11b125_osx_x64et 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 ...
Vall0n
2
1) Il peut également s'agir d'un problème lié au pilote graphique. Certaines propriétés comme point de départ pour le dépannage de docs.oracle.com/en/java/javase/11/troubleshoot/… . 2) Avez-vous essayé une version plus récente de org.openjfx:javafx-swing, par exemple 11? 3) En utilisant Java 11.0.5, Maven 3.6.2 et le plugin, org.openjfx:javafx-maven-plugin:0.0.4cela fonctionne sans problèmes de rendu (le rapport est affiché après avoir cliqué sur le Load Reportbouton). L'application démarre avec mvn clean javafx:run.
SubOptimal le

Réponses:

1

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.xmlune option JVM pour 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>

exécuter l'application avec mvn javafx:runelle signalera la configuration de Prism détectée

sortie sur mon système

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

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

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

la sortie est alors

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

Il utilise le logiciel de rendu Fallback to Prism SW pipeline.

versions utilisées pour les tests ci-dessus:

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
la source
merci pour le partage mais cette approche n'a pas résolu le problème.
Satish Pahuja
1
@SatishPahuja Quelle version concrète de Java java -versionutilisez-vous? Avez-vous essayé d'exécuter la version 11au lieu 11-ea+24du plugin org.openjfx:javafx-swing?
SubOptimal