Как заблокировать родительское окно в JavaFx, когда отчет Jasper виден во всплывающем окне - PullRequest
1 голос
/ 27 октября 2019

Для создания Jasper Report в JavaFX 11 я использую динамические отчеты. Когда я нажимаю кнопку Джаспер, отчет открывается и виден во всплывающем окне. Но я могу нажать на кнопку столько раз, сколько захочу, и отчет откроется столько раз. Но я хочу заблокировать родительское окно, как только отчет о яшме станет видимым, чтобы родительское окно было доступно только после закрытия всплывающего окна. То же самое, что мы можем достичь в Родительском и Дочернем Окне, как объяснено в этом вопросе , но я хочу достичь того же, что и для Родителя, когда моя сцена и ребенок являются окном Джаспера. Код для того же самого упомянут ниже: -

JavaFxJasperReportsDemo.java

package demo;

import java.util.ArrayList;
import java.util.List;

import javafx.application.Application;
import javafx.application.Platform;
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.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;

public class JavaFxJasperReportsDemo extends Application{

    @FXML
    private StackPane stackPane;

    public void start(Stage stage) throws Exception{

        try{
            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 {
            report.show(false);
        } catch (DRException e) {
            e.printStackTrace();
        }

    }

    public static void main(String[] args){
        try{
            launch(args);
        }
        catch (Exception e){
            e.printStackTrace();
        }
    }
}

1 Ответ

0 голосов
/ 28 октября 2019

На данный момент у меня нет решения, основанного на «достижимости» родительского окна. Но я могу предоставить вам альтернативное решение, чтобы пользователь не мог щелкнуть несколько раз. Идея состоит в том, чтобы отключить корневой узел сцены, как только вы нажмете кнопку, и включите его только при закрытом окне отчета. Не уверен, подходит ли это вашей цели.

reportButton.setOnAction(e -> {
    // Get root node of the scene
    Node sceneRoot = ((Node)e.getTarget()).getScene().getRoot();

    // First things first, disable it !!
    sceneRoot.setDisable(true);

    // Your actual method for showing report
    loadReport(e);

    // Get all current AWT windows.
    java.awt.Window[] windows = java.awt.Window.getWindows();

    // Get the recently added window (your report window) and add a close listener.
    windows[windows.length-1].addWindowListener(new java.awt.event.WindowAdapter() {
        public void windowClosing(java.awt.event.WindowEvent evt) {
            // When the window is closed, enable your root node.
            sceneRoot.setDisable(false);
        }
    });
});

Примечание. Внутренняя реализация JasperViewer JasperReportBuilder представляет собой JFrame.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...