JavaFX类控制器阶段/窗口引用

时间:2012-10-22 16:19:17

标签: java javafx-2 javafx

有没有办法从关联的类控制器获取FXML加载文件的Stage / Window对象?

特别是,我有一个模态窗口的控制器,我需要舞台关闭它。

2 个答案:

答案 0 :(得分:7)

我无法找到解决问题的优雅方案。但我发现了这两种选择:

  • 从场景中的节点获取窗口参考

    @FXML private Button closeButton ;
    
    public void handleCloseButton() {
      Scene scene = closeButton.getScene();
      if (scene != null) {
        Window window = scene.getWindow();
        if (window != null) {
          window.hide();
        }
      }
    }
    
  • 加载FXML时,将Window作为参数传递给控制器​​。

    String resource = "/modalWindow.fxml";
    
    URL location = getClass().getResource(resource);
    FXMLLoader fxmlLoader = new FXMLLoader();
    fxmlLoader.setLocation(location);
    fxmlLoader.setBuilderFactory(new JavaFXBuilderFactory());
    
    Parent root = (Parent) fxmlLoader.load();
    
    controller = (FormController) fxmlLoader.getController();
    
    dialogStage = new Stage();
    
    controller.setStage(dialogStage);
    
    ...
    

    FormController必须实现setStage方法。

答案 1 :(得分:0)

@FXML
private Button closeBtn;
Stage currentStage = (Stage)closeBtn.getScene().getWindow();
currentStage.close();

另一种方法是为舞台定义静态getter并访问它

  

主类

public class Main extends Application {
    private static Stage primaryStage; // **Declare static Stage**

    private void setPrimaryStage(Stage stage) {
        Main.primaryStage = stage;
    }

    static public Stage getPrimaryStage() {
        return Main.primaryStage;
    }

    @Override
    public void start(Stage primaryStage) throws Exception{
        setPrimaryStage(primaryStage); // **Set the Stage**
        Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
        primaryStage.setTitle("Hello World");
        primaryStage.setScene(new Scene(root, 300, 275));
        primaryStage.show();
    }
}

现在您可以通过调用

来访问此阶段
  

Main.getPrimaryStage()

在控制器类

public class Controller {
public void onMouseClickAction(ActionEvent e) {
    Stage s = Main.getPrimaryStage();
    s.close();
}
}