Jasper zgłasza, że ​​składniki nie są poprawnie renderowane w JavaFX Swing Node

13

Do tworzenia raportu Jaspera w JavaFX 11 używam raportów dynamicznych. Ładuję raport do węzła Swing, ale raport Jasper pojawia się tylko wtedy, gdy kliknę obszar okienka stosu i wszystkie inne komponenty będą widoczne tylko po najechaniu kursorem na wszystkie te komponenty. Komponenty i zawartość raportu nie ładują się natychmiast, a nie są wyświetlane po najechaniu myszą, a raport jest wyświetlany podczas przewijania w okienku stosu.

Ponieważ był to błąd w Javie 8 i wydaje się, że został rozwiązany, ale również w Javie 11 pojawia się ten sam problem.

Aktualizacja

Ponieważ nie otrzymuję żadnej odpowiedzi i jak sugeruje kleopatra, stworzyłem minimalny powtarzalny kod. Proszę spojrzeć na to.

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>

Zależności, których używam to: -

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

Wynik

  1. Po kliknięciu przycisku wczytaj raport, widoczna jest tylko jedna ikona zapisu, brak raportu. Po kliknięciu przycisku wczytaj raport, widoczna jest tylko jedna ikona zapisu, brak raportu

  2. Po kliknięciu obszaru okienka stosu teraz Raport jest widoczny. Po kliknięciu obszaru okienka stosu teraz Raport jest widoczny

  3. Po najechaniu kursorem na inną ikonę teraz widoczna jest ikona Drukuj. Po najechaniu kursorem na inną ikonę teraz widoczna jest ikona Drukuj

  4. Po najechaniu myszką także na inne ikony stają się one widoczne jeden po drugim. Po najechaniu myszką także na inne ikony stają się one widoczne jeden po drugim

Satish Pahuja
źródło
Dostaję tylko głosy poparcia, ale nikt nie daje mi odpowiedzi. Bardzo pragnę znaleźć rozwiązanie tego pytania.
Satish Pahuja,
3
możesz zwiększyć swoje szanse na odpowiedź, podając minimalny, powtarzalny przykład (uwaga: nie pełny kod, ale mały przykład napisany wyłącznie w celu zademonstrowania twojego problemu :)
kleopatra,
2
i dodaj wszystkie odpowiednie tagi ... może ktoś z tłumu swing / jasperreport ma przydatne informacje
kleopatra,
1
Cześć, uruchomiłem program jbsdk11b125_osx_x64i nie mogłem odtworzyć problemu. Pokazuje bezpośrednio całą zawartość. Chociaż pojawia się ostrzeżenie Ładowanie dokumentu FXML z API JavaFX w wersji 11.0.1 przez środowisko wykonawcze JavaFX w wersji 10.0.2-wewnętrzne ...
Vall0n
2
1) Może to być także problem związany ze sterownikiem karty graficznej. Niektóre właściwości jako punkt wyjścia do rozwiązywania problemów docs.oracle.com/en/java/javase/11/troubleshoot/… . 2) Czy wypróbowałeś np. Nowszą wersję wydania org.openjfx:javafx-swing, np. 11? 3) Przy użyciu Java 11.0.5, Maven 3.6.2 i wtyczki org.openjfx:javafx-maven-plugin:0.0.4działa bez problemów z renderowaniem (raport wyświetla się po kliknięciu Load Reportprzycisku). Aplikacja jest uruchamiana z mvn clean javafx:run.
SubOptimal

Odpowiedzi:

1

Po sprawdzeniu wiki OpenJDK pod kątem flag debugowania OpenJFX, możesz spróbować wykonać następujące czynności.

dodaj w sekcji kompilacji pom.xmlopcję JVM dla 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>

uruchom aplikację z mvn javafx:runtym zgłosi wykrytą konfigurację Prism

wyjście w moim systemie

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

korzysta z renderera przyspieszanego sprzętowo Loading ES2 native library ... prism_es2

Możliwe jest wymuszenie użycia renderera oprogramowania. Zmień wpom.xml

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

wynik jest wtedy

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

Korzysta z renderera oprogramowania Fallback to Prism SW pipeline.

wersje użyte do powyższych testów:

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)
SubOptimal
źródło
dzięki za udostępnienie, ale to podejście nie rozwiązało problemu.
Satish Pahuja
1
@SatishPahuja Której konkretnej wersji Java java -versionużywasz? Czy próbowałeś uruchomić wersję 11zamiast 11-ea+24wtyczki org.openjfx:javafx-swing?
SubOptimal