参考的这个网址的方法http://statsciolist.blogspot.com/2013/04/javafx-modal-dialog-with-controller.html
- 在main函数里面建立Controller的对象,并且在Controller里面建立一个添加Stage的方法。
- 建立新的对话框fxml文件,和主fxml的建立方法一样
public class Main extends Application { @Override public void start(Stage primaryStage) { try { /*Parent root = FXMLLoader.load(getClass().getResource("study.fxml")); Scene scene = new Scene(root, 1000, 600); primaryStage.initStyle(StageStyle.DECORATED); primaryStage.setScene(scene); primaryStage.setTitle("Stony * Health"); primaryStage.show(); */ FXMLLoader loader = new FXMLLoader(); loader.setLocation(getClass().getResource("study.fxml")); loader.load(); Parent root = loader.getRoot(); //主控制器的对象,用于获取主函数中的Stage对象 Controller c =(Controller)loader.getController(); c.setStage(primaryStage); Scene scene = new Scene(root,1000,600); primaryStage.setScene(scene); primaryStage.show(); } catch(Exception e) { e.printStackTrace(); } } public static void main(String[] args) { launch(args); } }
这个main函数的代码,重点在于获取Stage对象传入Controller中。如果要在对话框中要再建立对话框,就一直重复嵌套下去。public Stage primaryStage;//建立Stage对象 { FXMLLoader loader = new FXMLLoader(); //Dialog.fxml为对话框的fxml文件 loader.setLocation(getClass().getResource("Dialog.fxml")); try { loader.load(); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } Parent root = loader.getRoot(); Stage modal_dialog = new Stage(StageStyle.DECORATED); modal_dialog.initModality(Modality.WINDOW_MODAL); //把主窗口和子窗口联系起来。不加也可以 modal_dialog.initOwner(primaryStage); Scene scene = new Scene(root); modal_dialog.setScene(scene); modal_dialog.show(); } //在主函数中获取primaryStage对象的公共方法 public void setStage(Stage temp) { primaryStage = temp; }