สำหรับการสร้างรายงาน Jasper ใน JavaFX 11 ฉันใช้รายงานแบบไดนามิก ฉันกำลังโหลดรายงานภายใน Swing Node แต่รายงาน Jasper จะปรากฏขึ้นก็ต่อเมื่อฉันจะคลิกที่พื้นที่สแต็กบานหน้าต่างและส่วนประกอบอื่น ๆ ทั้งหมดจะปรากฏให้เห็นเฉพาะเมื่อฉันวางเมาส์บนส่วนประกอบเหล่านั้นทั้งหมด ส่วนประกอบและเนื้อหารายงานไม่โหลดขึ้นมาทันทีแทนที่จะแสดงบนเมาส์โฉบและรายงานจะแสดงเมื่อเลื่อนไปที่ Stack Pane
เช่นนี้เป็นข้อผิดพลาดใน Java 8 และดูเหมือนว่าจะได้รับการแก้ไข แต่ใน Java 11 เกินไปฉันได้รับปัญหาเดียวกัน
ปรับปรุง
เนื่องจากฉันไม่ได้รับการตอบสนองใด ๆ และตามที่ kleopatra แนะนำฉันได้สร้างรหัสที่ทำซ้ำได้น้อยที่สุด โปรดดูสิ่งนี้
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>การพึ่งพาที่ฉันใช้คือ: -
<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>เอาท์พุต
jbsdk11b125_osx_x64และไม่สามารถทำซ้ำปัญหาได้ มันแสดงเนื้อหาที่สมบูรณ์โดยตรง แม้ว่าฉันจะได้รับคำเตือนการโหลดเอกสาร FXML ด้วย JavaFX API ของรุ่น 11.0.1 โดย JavaFX รันไทม์ของรุ่น
                org.openjfx:javafx-swingเช่น11? 3)การใช้ Java 11.0.5, Maven 3.6.2 และปลั๊กอินorg.openjfx:javafx-maven-plugin:0.0.4ใช้งานได้โดยไม่มีปัญหาการแสดงผล (รายงานจะแสดงหลังจากคลิกที่Load Reportปุ่ม) app mvn clean javafx:runจะเริ่มต้นด้วย
                


