从 javafx 应用程序菜单项单击显示一个JDialog
包含Jasper 报告的摆动。JRViewer
但是JDialog
即使之后它也不是 MODAL,setModal(true)
因为它不属于 javafx 阶段。如何使 javafx 阶段成为 a 的所有者JDialog
?或者,如何在 javafx 舞台、场景中显示 Jasper 报告?
6 回答
不要使用 JDialog。在 JavaFX 中,您使用Stages。将 Jasper 报告放入Scene中,将 Scene 放入 Stage 中。我认为您不能将 Swing 组件放入 JavaFX 组件中,因此您必须检查此链接:将 JavaFX 集成到 Swing 应用程序中
制作 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);
在上面的代码中,舞台的行为与对话框完全一样。
还要检查这个:
回到第一个(基本)问题:不可能让 Stage 成为 JDialog 的所有者。但是,设置好 SwingNode 的内容后
swingNode.setContent(xxx);
您可以获取 xxx 的父级(也可能是 xxx 的父级的父级......),直到找到(AWT-)框架或(AWT-)对话框。在 SwingNode 的情况下,它是一个 JLightweightFrame。您可以使用此对象作为所有者来创建您的 JDialog。
但是,我认为 JavaFX SwingNode 机制中存在错误。如果将 JDialog 设置为模态 ( setModal(true)
),则 JDialog 在功能上显示为模态,但它可能会出现在主 (JavaFX) 窗口的后面。仍然可以移动主窗口,把它放在前面等等,如果有一个模态对话框,这应该是不可能的。但这是另一个话题。
在 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();
Alternatively how to display a Jasper report inside a javafx stage, scene?
Output HTML from your Jasper report and load the report in a JavaFX WebView.
Make a javafx stage the owner of a JDialog?
I don't think this is possible. What should work instead is to make your application a Swing application and host your JavaFX content inside a JFXPanel inside a Swing JFrame. Then you have no Stage and the owner of the JDialog can be the JFrame hosting the JFXPanel.
我在 JavaFX 8 中编写了一个 JasperReports 打印预览阶段类。它是纯 JavaFX 代码,不需要使用SwingNode类。
与 JRViewer 相比,它不支持链接和部件,但打印预览窗口无论如何也不需要它。另一方面,代码要短得多,因此很容易理解并进一步满足每个人的需求。
此类的源代码可在GitHub 存储库中免费获得。
现在可以做到了,
您现在需要的是安装 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