Компоненты Jasper Reports неправильно отображают в JavaFX Swing Node

13

Для создания Jasper Report в JavaFX 11 я использую динамические отчеты. Я загружаю отчет в Swing Node, но отчет Jasper появляется только в том случае, если я щелкну область области стека и все другие компоненты, видимые только в том случае, если я наведу курсор на все эти компоненты. Компоненты и содержимое отчета не загружаются мгновенно, а отображаются при наведении мыши, а отчет отображается при прокрутке на панели стека.

Так как это была ошибка в Java 8 и, похоже, она устранена, но и в Java 11 я получаю ту же проблему.

Обновить

Поскольку я не получаю никакого ответа и, как подсказывает Клеопатра, я создал минимальный воспроизводимый код. Пожалуйста, посмотрите на это.

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>

Вывод

  1. После нажатия на кнопку загрузки отчета отображается только один значок сохранения, а отчет не отображается. После нажатия на кнопку загрузки отчета отображается только один значок сохранения, а отчет не отображается

  2. После нажатия на область области стека теперь виден отчет. После нажатия на область области стека теперь отчет виден

  3. После наведения на другую иконку теперь отображается значок печати. После наведения на другую иконку теперь отображается значок печати

  4. При наведении курсора на другие значки они также становятся видимыми один за другим. При наведении курсора на другие значки, они становятся видимыми один за другим

Сатиш Пахуджа
источник
Я просто получаю голоса, но никто не дает мне ответа. Я очень отчаянно желаю получить какое-либо решение этого вопроса.
Сатиш Пахуджа
3
Вы можете повысить свои шансы на ответ, предоставив минимальный воспроизводимый пример (помните: не полный код, а небольшой пример, написанный с единственной целью демонстрации вашей проблемы :)
kleopatra
2
и добавьте все релевантные теги .. может быть, кто-то из толпы свингеров / джасперрепортов имеет некоторое полезное понимание
kleopatra
1
Привет! Я запустил программу jbsdk11b125_osx_x64и не смог воспроизвести проблему. Он показывает полный контент напрямую. Хотя я получаю предупреждение Загрузка документа FXML с API JavaFX версии 11.0.1 с помощью среды выполнения JavaFX версии 10.0.2-internal ...
Vall0n
2
1) Это также может быть проблема, связанная с графическим драйвером. Некоторые свойства в качестве отправной точки для устранения неполадок docs.oracle.com/en/java/javase/11/troubleshoot/… . 2) Вы пробовали более новую версию org.openjfx:javafx-swing, например 11? 3) Используя Java 11.0.5, Maven 3.6.2, и плагин org.openjfx:javafx-maven-plugin:0.0.4работает без проблем рендеринга (отчет отображается после нажатия на Load Reportкнопку). Приложение запускается с mvn clean javafx:run.
SubOptimal

Ответы:

1

После проверки вики OpenJDK на наличие флагов отладки OpenJFX вы можете попробовать выполнить следующее.

добавить в раздел сборки pom.xmlопции JVM для 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>

Запустите приложение, и mvn javafx:runоно сообщит об обнаруженной конфигурации Prism.

вывод на мою систему

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

он использует аппаратно ускоренный рендер Loading ES2 native library ... prism_es2

Возможно принудительное использование программного рендерера. Изменение вpom.xml

        <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

Это использует программное обеспечение рендерера Fallback to Prism SW pipeline.

версии, используемые для вышеуказанных тестов:

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)

специалист

Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)
Субоптимальное
источник
спасибо за обмен, но этот подход не решил проблему.
Сатиш Пахуджа
1
@SatishPahuja Какую конкретную версию Java java -versionвы используете? Вы пытались запустить релиз 11вместо 11-ea+24плагина org.openjfx:javafx-swing?
SubOptimal