Komponen Laporan Jasper tidak dirender dengan benar di JavaFX Swing Node

13

Untuk membuat Laporan Jasper di JavaFX 11 saya menggunakan laporan dinamis. Saya memuat laporan di dalam Swing Node tetapi laporan Jasper hanya muncul jika saya akan mengklik area tumpukan panel dan dan semua komponen lainnya hanya terlihat jika saya mengarahkan semua komponen itu. Komponen dan konten laporan tidak dimuat secara instan daripada ditampilkan pada mouse melayang dan laporan ditampilkan saat menggulir di atas Stack Pane.

Karena ini adalah bug di Java 8 dan tampaknya diselesaikan tetapi di Java 11 saya juga mendapatkan masalah yang sama.

Memperbarui

Karena saya tidak mendapatkan respons apa pun dan seperti yang disarankan oleh kleopatra saya telah membuat kode yang dapat direproduksi minimal. Silakan lihat ini.

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>

Dependensi yang saya gunakan adalah: -

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

Keluaran

  1. Setelah mengklik tombol muat laporan, hanya satu ikon simpan yang terlihat, tidak ada laporan yang terlihat. Setelah mengklik tombol muat laporan, hanya satu ikon simpan yang terlihat, tidak ada laporan yang terlihat

  2. Setelah mengklik Area Stack Pane sekarang Laporan terlihat. Setelah mengklik Area Stack Pane sekarang Laporan terlihat

  3. Setelah melayang di atas ikon lain sekarang ikon Cetak terlihat. Setelah melayang di atas ikon lain sekarang ikon Cetak terlihat

  4. Setelah melayang di atas ikon lain juga mereka menjadi terlihat satu per satu. Setelah melayang di atas ikon lain juga mereka menjadi terlihat satu per satu

Satish Pahuja
sumber
Saya hanya mendapatkan upvotes tetapi tidak ada yang memberi saya jawaban. Saya sangat ingin mendapatkan solusi dari pertanyaan ini.
Satish Pahuja
3
Anda dapat meningkatkan peluang Anda untuk jawaban dengan memberikan contoh minimal yang dapat direproduksi (pikiran: bukan kode lengkap Anda, tetapi sebuah contoh kecil yang ditulis untuk tujuan tunggal menunjukkan masalah Anda :)
kleopatra
2
dan tambahkan semua tag yang relevan .. mungkin seseorang dari kerumunan swing / jasperreport memiliki wawasan bermanfaat
kleopatra
1
Hai, saya sudah menjalankan program dengan jbsdk11b125_osx_x64dan saya tidak bisa mereproduksi masalah. Ini menunjukkan konten lengkap secara langsung. Meskipun saya mendapatkan peringatan Memuat dokumen FXML dengan JavaFX API versi 11.0.1 oleh JavaFX runtime versi 10.0.2-internal ...
Vall0n
2
1) Ini mungkin juga masalah terkait driver grafis. Beberapa properti sebagai titik awal untuk pemecahan masalah docs.oracle.com/en/java/javase/11/troubleshoot/… . 2) Sudahkah Anda mencoba versi rilis yang lebih baru org.openjfx:javafx-swing, misalnya 11? 3) Menggunakan Java 11.0.5, Maven 3.6.2, dan plugin org.openjfx:javafx-maven-plugin:0.0.4berfungsi tanpa rendering masalah (laporan ditampilkan setelah mengklik Load Reporttombol). Aplikasi dimulai dengan mvn clean javafx:run.
SubOptimal

Jawaban:

1

Setelah memeriksa wiki OpenJDK untuk bendera debug OpenJFX Anda dapat mencoba mengikuti.

tambahkan bagian build pom.xmlopsi JVM untuk 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>

jalankan aplikasi dengan mvn javafx:run itu akan melaporkan konfigurasi Prism yang terdeteksi

output pada sistem saya

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

itu menggunakan penyaji dipercepat perangkat keras Loading ES2 native library ... prism_es2

Dimungkinkan untuk memaksa penggunaan renderer perangkat lunak. Ubah dipom.xml

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

outputnya kemudian

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

Ini menggunakan perender perangkat lunak Fallback to Prism SW pipeline .

versi yang digunakan untuk tes di atas:

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
sumber
terima kasih sudah berbagi tetapi pendekatan ini tidak menyelesaikan masalah.
Satish Pahuja
1
@SatishPahuja Versi Java konkret java -versionyang Anda gunakan? Sudahkah Anda mencoba menjalankan rilis 11alih-alih 11-ea+24plugin org.openjfx:javafx-swing?
SubOptimal