Jasper Reports Компоненти не відображаються належним чином у Swing-вузлі JavaFX


13

Для створення звіту Jasper в JavaFX 11 я використовую динамічні звіти. Я завантажую звіт всередині Swing Node, але звіт Jasper з’являється лише в тому випадку, якщо я натискаю область панелі стека та всі інші компоненти, видимі лише в тому випадку, якщо навести курсор на всі ці компоненти. Вміст компонентів і звітів не завантажується миттєво, а не, як це відображається при наведенні миші, а звіт відображається при прокрутці панелі стека.

Оскільки це була помилка в 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>

Вихідні дані

  1. Після натискання на кнопку звіту про завантаження видно лише один значок збереження, звіт не видно. Після натискання на кнопку звіту про завантаження видно лише один значок збереження, звіт не видно

  2. Після натискання на «Область панелі стека» тепер видно звіт. Після натискання на «Область панелі стека» тепер видно звіт

  3. Після наведення курсору на іншу піктограму видно піктограму Друк. Після наведення курсору на іншу піктограму видно піктограму Друк

  4. Після наведення курсора на інші іконки вони стають видимими одна за одною. Після наведення курсора на інші іконки вони стають видимими одна за одною


Я просто отримую заявки, але ніхто не дає мені відповіді. Я дуже відчайдушно бажаю вирішити це питання.
Сатіш Пахуя

3
ви можете покращити свої шанси на відповідь, надавши мінімально відтворюваний приклад (розум: не ваш повний код, а невеликий приклад, написаний з єдиною метою демонстрації вашої проблеми :)
kleopatra

2
і додайте всі відповідні теги .. можливо, хтось із натовпу swing / jasperreport має корисну інформацію
kleopatra

1
Привіт, я запустив програму, jbsdk11b125_osx_x64і не зміг відтворити проблему. Він показує повний вміст безпосередньо. Хоча я отримую попередження Завантаження документа FXML з JavaFX API версії 11.0.1 JavaFX під час виконання версії 10.0.2-внутрішня ...
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 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)

дякую за спільний доступ, але цей підхід не вирішив проблему.
Satish Pahuja

1
@SatishPahuja Яку конкретну версію Java java -versionви використовуєте? Ви намагалися запустити випуск 11замість 11-ea+24плагіна org.openjfx:javafx-swing?
SubOptimal
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.