Jasper报告组件在JavaFX Swing节点中未正确呈现

Jasper报告组件在JavaFX Swing节点中未正确呈现,java,swing,javafx,jasper-reports,dynamic-reports,Java,Swing,Javafx,Jasper Reports,Dynamic Reports,为了在JavaFX11中创建Jasper报告,我使用了动态报告。我正在Swing节点内加载报告,但Jasper报告仅在我将鼠标悬停在所有这些组件上时才显示,而所有其他组件仅在我单击堆栈窗格区域时才显示。组件和报告内容不会立即加载,而不是在鼠标悬停时显示,在滚动堆栈窗格时显示报告 因为这是Java8中的问题,似乎已经解决了,但在Java11中,我也遇到了同样的问题 更新 因为我没有得到任何回应,正如克利奥帕特拉所建议的那样,我创建了最小的可复制代码。请调查一下 JavaFxJasperReport

为了在JavaFX11中创建Jasper报告,我使用了动态报告。我正在Swing节点内加载报告,但Jasper报告仅在我将鼠标悬停在所有这些组件上时才显示,而所有其他组件仅在我单击堆栈窗格区域时才显示。组件和报告内容不会立即加载,而不是在鼠标悬停时显示,在滚动堆栈窗格时显示报告

因为这是Java8中的问题,似乎已经解决了,但在Java11中,我也遇到了同样的问题

更新

因为我没有得到任何回应,正如克利奥帕特拉所建议的那样,我创建了最小的可复制代码。请调查一下

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();
        }
    }
}
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>

  • 单击堆栈窗格区域后,现在报告可见。

  • 将鼠标悬停在另一个图标上后,现在可以看到打印图标。

  • 在将鼠标悬停在其他图标上之后,它们将一个接一个地显示出来。


  • 在检查openjdkwiki之后,您可以尝试以下内容

    OpenJFX的JVM选项的
    pom.xml
    的add-in-build部分

    <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>
    
    它正在使用硬件加速渲染器
    加载ES2本机库。。。prism_es2

    可以强制使用软件渲染器。更改pom.xml中的

            <options>
                <option>-Dprism.verbose=true</option>
                <option>-Dprism.order=sw</option
            </options>
    
    它正在使用软件渲染器
    回退到Prism SW管道

    用于上述测试的版本:

    JDK

    马文


    我也遇到了一个类似的问题,但我通过向我的项目添加以下maven依赖项来解决它。我想它可以帮助别人。请不要,我更喜欢使用JRViewerFX,因为它解决了这个问题,而且UI比swing好得多


    我只是在争取选票,但没有人给我答案。我非常渴望得到这个问题的任何解决方案。你可以通过提供一个(注意:不是你的完整代码,而是为了演示你的问题而编写的一个小示例:)并添加所有相关标记来提高你获得答案的机会。。也许swing/jasperreport人群中的某个人有一些有用的见解:我用jbsdk11b125_osx_x64运行了这个程序,但我无法重现这个问题。它直接显示完整的内容。尽管我在10.0.2-internal版的JavaFX运行时加载带有11.0.1版JavaFXAPI的FXML文档时收到警告,但这也可能是图形驱动程序相关的问题。将某些属性作为疑难解答的起点。2) 您是否尝试过更新版本的
    org.openjfx:javafx swing
    ,例如
    11
    ?3) 使用Java 11.0.5、Maven 3.6.2和plugin
    org.openjfx:javafx Maven plugin:0.0.4
    它可以正常工作而不会出现渲染问题(在单击
    加载报告
    按钮后显示报告)。该应用程序以mvn clean javafx:run启动。感谢分享,但这种方法并没有解决问题。@SatishPahuja您使用哪种具体的Java版本
    Java-version
    ?您是否尝试过运行plugin
    org.openjfx:javafx swing
    的发行版
    11
    而不是
    11 ea+24
    ?我们在javafx应用程序的SwingNode中使用Qoppa PDF Viewer时遇到了类似问题。使用Java8时一切正常,当我们切换到OpenFx11(11.0.7)时,它在Windows10和MacOs机器上停止正常工作。但是,当我们将OpenFX11更新为OpenFX11 LTS(11.0.8)时,这个错误在MacOs上消失了,但在Windows机器上仍然存在。所以我的问题是,你在Windows上的这个问题上有什么进展吗?
    <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>
    
    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
    
            <options>
                <option>-Dprism.verbose=true</option>
                <option>-Dprism.order=sw</option
            </options>
    
    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
    
    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)
    
    Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)
    
    <dependency>
        <groupId>win.zqxu</groupId>
        <artifactId>jrviewer-fx</artifactId>
        <version>0.1.1</version>
    
    </dependency>
    
            JRViewerFX viewer = new JRViewerFX(jasperprint_report);        
    
                  Platform.runLater(new Runnable() {
                      @Override
                      public void run() {
    
                          report_scroll_pane.setContent(viewer);
                      }
                  });