让javafx阶段成为JDialog的所有者?

时间:2012-09-24 07:49:21

标签: javafx jdialog

在javafx应用程序菜单项单击中显示包含Jasper Report JDialog的摆动JRViewer。但是JDialog即使在setModal(true)之后也不是MODAL,因为它不归javafx阶段所有。如何让javafx阶段成为JDialog的所有者?或者如何在javafx舞台场景中显示Jasper报告?

6 个答案:

答案 0 :(得分:2)

不要使用JDialog。在JavaFX中,您使用Stages。将您的Jasper报告放在Scene内,将场景放在舞台上。我认为你不能把Swing组件放在JavaFX组件中,所以你必须检查这个链接:Integrating JavaFX into Swing Applications

制作JavaFX对话框的代码:

            Stage stage = new Stage();
            stage.setTitle("Title");
            stage.setResizable(false);
            stage.initModality(Modality.APPLICATION_MODAL);
            stage.initOwner(primaryStage);
            stage.initStyle(StageStyle.UTILITY);

            (...)

            Scene scene = new Scene(...);
            stage.setScene(scene);

在上面的代码中,舞台的行为与对话框完全相同。

同时检查:

How to create a JavaFX dialog?

Hello World, JavaFX Style

答案 1 :(得分:2)

回到第一个(基础)问题:不可能使舞台成为JDialog的所有者。但是,在设置SwingNode的内容

之后
swingNode.setContent(xxx);

你可以获得xxx的父级(也可能是xxx父级的父级),直到找到(AWT-)帧或(AWT-)对话框。在SwingNode的情况下,它是一个JLightweightFrame。您可以使用此对象作为所有者来创建JDialog。

但是,我认为JavaFX SwingNode机制中存在一个错误。 JDialog在功能上是模态的,如果你将其设置为模态(setModal(true)),但它可能出现在主(JavaFX)窗口的后面。它仍然可以移动主窗口,将它放在前面等等,如果有模态对话框,那么应该是不可能的。但这是另一个话题。

答案 2 :(得分:1)

要在javafx(jdk 1.8>)阶段查看Jasper报告,

JasperPrint jp = JasperFillManager.fillReport(reportsource, params,getCon());

                SwingNode swingNode = new SwingNode();
                swingNode.setContent(new JRViewer(jp));

                AnchorPane anchorPane = new AnchorPane();

                AnchorPane.setTopAnchor(swingNode,0.0);
                AnchorPane.setBottomAnchor(swingNode,0.0);
                AnchorPane.setLeftAnchor(swingNode,0.0);
                AnchorPane.setRightAnchor(swingNode,0.0);

                anchorPane.getChildren().add(swingNode);
                Scene scene = new Scene(anchorPane);
                Stage stage = new Stage();
                        stage.setHeight(550);
                        stage.setWidth(600);
                        stage.setAlwaysOnTop(true);
                        stage.setScene(scene);
                        stage.showAndWait();

答案 3 :(得分:0)

  

或者如何在javafx舞台场景中显示Jasper报告?

Output HTML from your Jasper report并在JavaFX WebView中加载报告。

  

让javafx阶段成为JDialog的所有者吗?

我不认为这是可能的。应该做的是使您的应用程序成为Swing应用程序并将您的JavaFX内容托管在Swing JFrame内的JFXPanel内。那么你没有Stage,JDialog的所有者可以是托管JFXPanel的JFrame。

答案 4 :(得分:0)

现在可以这样做了 你现在需要的是安装jdk 8
因为javafx中的swing内容是在jdk8中引入的

@FXML
private SwingNode swingNode;
...
JasperPrint jasperPrint = JasperFillManager.fillReport(FileName, hash, connect);
swingNode.setContent(new JRViewer(jasperPrint));

oracle也为此添加了教程 对于下一个你可以按照这个链接
oracle tutorial embed swing in javaFX

答案 5 :(得分:0)

我在JavaFX 8中编写了一个JasperReports打印预览阶段类。它是一个纯JavaFX代码,不需要使用SwingNode类。

与JRViewer相比,它不支持链接和部件,但打印预览窗口无论如何都不需要它。另一方面,代码更短,更短,因此易于理解并进一步满足每个人的需求。

此课程的源代码可在GitHub repository免费获取。