如何在JavaFX 2.1中创build一个模态窗口

我无法弄清楚如何在JavaFX中创build一个模态窗口。 基本上我有文件select器,我想要问用户一个问题,当他们select一个文件。 我需要这些信息来parsing文件,所以执行需要等待答案。

我已经看到这个问题,但我一直无法find如何实现这种行为。

这里是我之前为JavaFX 2.1中的modal dialog创build的解决scheme的链接。该解决scheme在当前阶段之上创build模态阶段,并通过对话框控件的事件处理程序对对话结果执行操作。

更新

之前的链接解决scheme使用过时的事件处理程序方法在对话被解除后采取行动。 这种方法对于JavaFX 2.2之前的实现是有效的。 对于JavaFX 8+,不需要事件处理程序,而是使用新的Stage showAndWait()方法。 例如:

 Stage dialog = new Stage(); // populate dialog with controls. ... dialog.initOwner(parentStage); dialog.initModality(Modality.APPLICATION_MODAL); dialog.showAndWait(); // process result of dialog operation. ... 

请注意,为了使事情按预期工作,初始化舞台所有者以及将舞台的模式初始化为WINDOW_MODAL或APPLICATION_MODAL非常重要 。

JavaFX 8和ControlsFX中有一些高质量的标准UI对话框,如果它们符合您的要求,我build议使用这些对话框而不是自己开发。 这些内置的JavaFX 对话框和警报类也有initOwnerinitModalityshowAndWait方法,因此您可以根据需要设置它们的模态(注意,默认情况下,内置的对话框是应用程序模式)。

在我看来这是不好的解决scheme,因为父窗口是所有的时间活动。
例如,如果你想打开窗口作为模式后单击button…

 private void clickShow(ActionEvent event) { Stage stage = new Stage(); Parent root = FXMLLoader.load( YourClassController.class.getResource("YourClass.fxml")); stage.setScene(new Scene(root)); stage.setTitle("My modal window"); stage.initModality(Modality.WINDOW_MODAL); stage.initOwner( ((Node)event.getSource()).getScene().getWindow() ); stage.show(); } 

现在你的新窗​​口是真实的模式 – 父母是块。 也可以使用

 Modality.APPLICATION_MODAL 

你可以创build像我的样本应用程序。 这只是单个文件的JavaFX应用程序。

 public class JavaFXApplication1 extends Application { @Override public void start(Stage primaryStage) { Button btn = new Button(); btn.setText("Say 'Hello World'"); btn.setOnAction(new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent event) { Stage stage; stage = new Stage(); final SwingNode swingNode = new SwingNode(); createSwingContent(swingNode); StackPane pane = new StackPane(); pane.getChildren().add(swingNode); stage.initModality(Modality.APPLICATION_MODAL); stage.setTitle("Swing in JavaFX"); stage.setScene(new Scene(pane, 250, 150)); stage.show(); } }); StackPane root = new StackPane(); root.getChildren().add(btn); Scene scene = new Scene(root, 300, 250); primaryStage.setTitle("Hello World!"); primaryStage.setScene(scene); primaryStage.show(); } private void createSwingContent(final SwingNode swingNode) { SwingUtilities.invokeLater(() -> { try { Path currentRelativePath = Paths.get(""); String s = currentRelativePath.toAbsolutePath().toString(); JasperDesign jasperDesign = JRXmlLoader.load(s + "/src/reports/report1.jrxml"); String query = "SELECT * FROM `accounttype`"; JRDesignQuery jrquery = new JRDesignQuery(); jrquery.setText(query); jasperDesign.setQuery(jrquery); JasperReport jasperReport = JasperCompileManager.compileReport(jasperDesign); JasperPrint JasperPrint = JasperFillManager.fillReport(jasperReport, null, c); //JRViewer viewer = new JRViewer(JasperPrint); swingNode.setContent(new JRViewer(JasperPrint)); } catch (JRException ex) { Logger.getLogger(AccountTypeController.class.getName()).log(Level.SEVERE, null, ex); } }); } /** * @param args the command line arguments */ public static void main(String[] args) { launch(args); } }