जैस्पर रिपोर्ट घटक जावाएफ़एक्स स्विंग नोड में ठीक से प्रतिपादन नहीं करते हैं


13

JavaFX 11 में जैस्पर रिपोर्ट बनाने के लिए मैं डायनामिक रिपोर्ट का उपयोग कर रहा हूं। मैं स्विंग नोड के अंदर रिपोर्ट लोड कर रहा हूं लेकिन जैस्पर रिपोर्ट केवल तभी दिखाई देती है जब मैं स्टैक पेन क्षेत्र पर क्लिक करूंगा और अन्य सभी घटक केवल तभी दिखाई देंगे जब मैं उन सभी घटकों पर मंडराऊंगा। घटक और रिपोर्ट सामग्री माउस होवरिंग पर प्रदर्शित होने के बजाय तुरंत लोड नहीं कर रही है और स्टैक फलक पर स्क्रॉल करते समय रिपोर्ट दिखाई दे रही है।

जैसा कि यह जावा 8 में बग था और हल किया जा रहा है, लेकिन जावा 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. Stack Pane Area पर क्लिक करने के बाद अब रिपोर्ट दिखाई दे रही है। Stack Pane Area पर क्लिक करने के बाद अब रिपोर्ट दिखाई दे रही है

  3. दूसरे आइकन पर मंडराने के बाद अब प्रिंट आइकन दिखाई देता है। दूसरे आइकन पर मंडराने के बाद अब प्रिंट आइकन दिखाई देता है

  4. अन्य आइकनों पर मंडराने के बाद भी वे एक-एक करके दिखाई दे रहे हैं। अन्य आइकनों पर मंडराने के बाद भी वे एक-एक करके दिखाई दे रहे हैं


मैं अभी उठ रहा हूं, लेकिन कोई मुझे जवाब नहीं दे रहा है। मैं इस प्रश्न का कोई भी समाधान पाने के लिए बहुत ज्यादा बेताब हूं।
सतीश पाहुजा

3
यदि आप एक प्रदान करके एक जवाब के लिए अवसरों में सुधार हो सकता है कम से कम प्रतिलिपि प्रस्तुत करने योग्य उदाहरण (मन: नहीं अपना पूरा कोड है, लेकिन एक छोटा सा उदाहरण आपकी समस्या को प्रदर्शित करने का :) एकमात्र उद्देश्य के लिए लिखा
Kleopatra

2
और सभी प्रासंगिक टैग जोड़ने .. शायद स्विंग / jasperreport भीड़ से किसी को कुछ उपयोगी अंतर्दृष्टि है
Kleopatra

1
नमस्ते, मैं कार्यक्रम चला jbsdk11b125_osx_x64रहा हूं और मैं इस मुद्दे को पुन: पेश नहीं कर सका। यह पूरी सामग्री को सीधे दिखाता है। हालाँकि मुझे एक चेतावनी मिल रही है लोड हो रहा है FXML दस्तावेज़ JavaFX API के संस्करण 11.0.1 के साथ JavaFX संस्करण के संस्करण 10.0.2-आंतरिक ...
Val0n

2
1) यह ग्राफिक्स ड्राइवर से संबंधित समस्या भी हो सकती है। Docs.oracle.com/en/java/javase/11/troubleshoot/… के समस्या निवारण के लिए प्रारंभिक बिंदु के रूप में कुछ गुण । 2) क्या आपने एक नए रिलीज़ संस्करण की कोशिश की है org.openjfx:javafx-swing, जैसे 11? ३) जावा ११.०.५, मावेन ३.६.२, और प्लगइन का उपयोग करना org.openjfx:javafx-maven-plugin:0.0.4यह मुद्दों को प्रस्तुत किए बिना काम करता है (रिपोर्ट Load Reportबटन पर क्लिक करने के बाद दिखाया गया है )। ऐप के साथ शुरू किया गया है mvn clean javafx:run
सबऑप्टीमल

जवाबों:


1

OpenJDK विकि को OpenJFX डिबग फ़्लैग के लिए जाँचने के बाद आप निम्नलिखित प्रयास कर सकते हैं।

pom.xmlOpenJFX के लिए JVM विकल्प के बिल्ड सेक्शन में जोड़ें

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

Maven

Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)

साझा करने के लिए धन्यवाद, लेकिन इस दृष्टिकोण से समस्या हल नहीं हुई।
सतीश पाहुजा

1
@SatishPahuja आप किस ठोस जावा संस्करण का java -versionउपयोग करते हैं? क्या आपने प्लगइन के 11बजाय रिलीज़ को चलाने की कोशिश की है ? 11-ea+24org.openjfx:javafx-swing
सबऑप्टिमल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.