Javafx利用fxml的方式添加对话框

时间:2022-02-04 17:02:14
参考的这个网址的方法http://statsciolist.blogspot.com/2013/04/javafx-modal-dialog-with-controller.html
  1. 在main函数里面建立Controller的对象,并且在Controller里面建立一个添加Stage的方法。
  2. 建立新的对话框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;
    }