JavaFX 2.0 FXML儿童Windows

经过多次搜索,我发现了这个问题如何创建一个javafx 2.0应用程序MDI 。 我真正想知道的是,如果我可以使用JavaFX组件和Scene Builder创建一个弹出窗口或子窗口到主窗口来创建新窗口。

我最终得到了一个模态弹出窗口:

在Main类中,我想将主阶段保存到我可以从主控制器类访问的字段中。 所以,我在Main.Start()方法中为它添加了一个静态变量Stage

primaryController.primaryStage = primaryStage; 

这是primaryController中的按钮使用的方法:

 public void OnBtnShowChild(ActionEvent event) { MessageBoxController msgBox = new MessageBoxController(); try { msgBox.showMessageBox(primaryStage); } catch (Exception e) { e.printStackTrace(); } } 

这是我在Scene Builder的帮助下创建的MessageBoxController类。 它具有标准弹出框的基本布局,可用于显示Icon(ImageView),TextBox(用于消息文本)和两个按钮(用于YES / NOfunction)。 我不确定如何将按钮被按下的结果传达给primaryController。

 public class MessageBoxController implements Initializable { @FXML // fx:id="btnNo" private Button btnNo; // Value injected by FXMLLoader @FXML // fx:id="btnYes" private Button btnYes; // Value injected by FXMLLoader @FXML // fx:id="imgMessage" private ImageView imgMessage; // Value injected by FXMLLoader @FXML // fx:id="txtMessage" private TextField txtMessage; // Value injected by FXMLLoader private Stage myParent; private Stage messageBoxStage; public void showMessageBox(Stage parentStage) { this.myParent = parentStage; try { messageBoxStage = new Stage(); AnchorPane page = (AnchorPane) FXMLLoader.load(MessageBoxController.class.getResource("/MessageBox/MessageBoxFXML.fxml")); Scene scene = new Scene(page); messageBoxStage.setScene(scene); messageBoxStage.setTitle("Message Box"); messageBoxStage.initOwner(this.myParent); messageBoxStage.initModality(Modality.WINDOW_MODAL); messageBoxStage.show(); } catch (Exception ex) { System.out.println("Exception foundeth in showMessageBox"); ex.printStackTrace(); } } @Override public void initialize(URL fxmlFileLocation, ResourceBundle arg1) { txtMessage.setText("Howdy"); } public void OnBtnYes(ActionEvent event) { } public void OnBtnNo(ActionEvent event) { } 

}

最后,这是我在Scene Builder中创建的FXML文件:

                       

有了这个,我可以创建一个模态弹出窗口,我还想创建其他子窗口,以便使用不同的控件以其他方式显示数据。 而且,最重要的是,我可以使用Scene Builder来创建布局。

你怎么看? 这是一个很好的方法,直到他们在Java 8和JavaFX 8中添加真正的支持?

你是否尝试过集体课? 你可以添加不同的元素与fxml和控制器。

 Group root= new Group(); AnchorPane frame=FXMLLoader.load(getClass().getResource("frame.fxml")); AnchorPane content= FXMLLoader.load(getClass().getResource("principal.fxml")); root.getChildren().add(window); root.getChildren().add(frame); Scene scene = new Scene(root); stage.setScene(scene); stage.show();