Các thành phần báo cáo của Jasper không hiển thị đúng trong Nút xoay JavaFX


13

Để tạo Báo cáo Jasper trong JavaFX 11 Tôi đang sử dụng các báo cáo động. Tôi đang tải báo cáo bên trong Swing Node nhưng báo cáo Jasper chỉ xuất hiện nếu tôi sẽ nhấp vào khu vực ngăn xếp ngăn xếp và tất cả các thành phần khác chỉ hiển thị nếu tôi di chuột qua tất cả các thành phần đó. Các thành phần và nội dung báo cáo không tải ngay lập tức thay vì hiển thị khi di chuột và báo cáo được hiển thị khi cuộn qua Ngăn xếp ngăn xếp.

Vì đây là lỗi trong Java 8 và dường như đã được giải quyết nhưng trong Java 11 tôi cũng gặp vấn đề tương tự.

Cập nhật

Vì tôi không nhận được bất kỳ phản hồi nào và theo đề xuất của kleopatra, tôi đã tạo mã tái sản xuất tối thiểu. Hãy nhìn vào đây.

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>

Phụ thuộc tôi đang sử dụng là: -

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

Đầu ra

  1. Sau khi nhấp vào nút báo cáo tải, chỉ có một biểu tượng lưu không hiển thị, không có báo cáo nào hiển thị. Sau khi nhấp vào nút báo cáo tải, chỉ có một biểu tượng lưu không hiển thị

  2. Sau khi nhấp vào Stack Pane Area, bây giờ Báo cáo sẽ hiển thị. Sau khi nhấp vào Stack Pane Area ngay bây giờ Báo cáo sẽ hiển thị

  3. Sau khi di chuột qua biểu tượng khác, biểu tượng In hiện rõ. Sau khi di chuột qua biểu tượng khác, biểu tượng In hiện rõ

  4. Sau khi di chuột qua các biểu tượng khác, chúng sẽ hiển thị từng cái một. Sau khi di chuột qua các biểu tượng khác, chúng sẽ hiển thị từng cái một


Tôi chỉ nhận được upvote nhưng không ai cho tôi câu trả lời. Tôi rất tuyệt vọng để có được bất kỳ giải pháp của câu hỏi này.
Satish Pahuja

3
bạn có thể cải thiện cơ hội cho câu trả lời bằng cách cung cấp một ví dụ có thể lặp lại tối thiểu (lưu ý: không phải mã đầy đủ của bạn, nhưng một ví dụ nhỏ được viết cho mục đích duy nhất là chứng minh vấn đề của bạn :)
kleopatra

2
và thêm tất cả các thẻ có liên quan .. có thể ai đó từ đám đông swing / jasperreport có một số hiểu biết hữu ích
kleopatra

1
Xin chào, tôi đã chạy chương trình cùng jbsdk11b125_osx_x64và tôi không thể tái tạo vấn đề. Nó hiển thị nội dung đầy đủ trực tiếp. Mặc dù tôi nhận được cảnh báo Đang tải tài liệu FXML bằng API JavaFX phiên bản 11.0.1 bằng thời gian chạy JavaFX của phiên bản 10.0.2-Internal ...
Vall0n

2
1) Nó cũng có thể là một vấn đề liên quan đến trình điều khiển đồ họa. Một số thuộc tính làm điểm bắt đầu để khắc phục sự cố docs.oracle.com/en/java/javase/11/troubledhoot/ . 2) Bạn đã thử phiên bản phát hành mới hơn chưa org.openjfx:javafx-swing, vd 11? 3) Sử dụng Java 11.0.5, Maven 3.6.2 và plugin org.openjfx:javafx-maven-plugin:0.0.4hoạt động mà không gặp sự cố kết xuất (báo cáo được hiển thị sau khi nhấp vào Load Reportnút). Ứng dụng được bắt đầu với mvn clean javafx:run.
Tối thiểu

Câu trả lời:


1

Sau khi kiểm tra wiki OpenJDK cho các cờ gỡ lỗi OpenJFX, bạn có thể thử làm theo.

thêm phần xây dựng của pom.xmltùy chọn JVM cho 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>

thực thi ứng dụng với mvn javafx:runnó sẽ báo cáo cấu hình Prism được phát hiện

đầu ra trên hệ thống của tôi

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

đó là sử dụng trình kết xuất tăng tốc phần cứng Loading ES2 native library ... prism_es2

Có thể buộc sử dụng trình kết xuất phần mềm. Thay đổi trongpom.xml

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

đầu ra là sau đó

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

Đó là sử dụng trình kết xuất phần mềm Fallback to Prism SW pipeline.

phiên bản được sử dụng cho các thử nghiệm trên:

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)

cảm ơn đã chia sẻ nhưng cách tiếp cận này không giải quyết được vấn đề.
Satish Pahuja

1
@SatishPahuja Bạn java -versionsử dụng phiên bản Java cụ thể nào ? Bạn đã thử chạy bản phát hành 11thay vì 11-ea+24plugin org.openjfx:javafx-swingchưa?
Tối thiểu
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.