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

时间:2021-12-19 17:04:13
参考的这个网址的方法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;
    	}