怎么从controllers 访问 Stage

为啥要这么做?

  1. 问和操作 Stage 对象: 在 JavaFX 应用程序中,Stage 对象是顶层容器,它代表应用程序窗口。通过将 Stage 引用传递给控制器,你可以直接从控制器中访问和操作窗口,例如:

    • 改变窗口的标题。
    • 调整窗口的大小。
    • 设置窗口的图标。
    • 控制窗口的显示和隐藏。
    • 监听窗口的关闭事件。
  2. 实现全屏模式: 如果你需要在应用程序中实现全屏模式,可以通过 Stage 对象的 setFullScreen 方法来实现。

  3. 模态对话框: 你可能需要在应用程序中显示模态对话框(例如,输入对话框、确认对话框等)。这需要创建一个新的 Stage 作为对话框,并通过主 Stage 来控制其模态行为。

  4. 跨场景传递数据: 当你需要在不同的场景(Scene)之间传递数据时,可以将 Stage 作为中介来存储和传递这些数据。

  5. 集中管理窗口: 在多窗口应用程序中,通过在控制器中访问 Stage,可以更方便地管理多个窗口,例如,确保只有一个窗口实例是打开的,或者关闭所有打开的窗口。

  6. 自定义窗口行为: 有时你可能需要自定义窗口的行为,比如拖动窗口的特定部分来移动窗口,这需要直接操作 Stage

  7. 响应窗口事件: 你可能需要响应窗口的某些事件,如窗口关闭、图标化、最大化等,这需要通过 Stage 的相应事件监听器来实现。

  8. //将 Stage 传递给控制器: 当你使用 FXMLLoader 加载 FXML 文件并创建控制器实例时,可以手动将 Stage 的引用传递给控制器。
    
    -------------------------------------------------------------------------------------------
    package com.example.javafx03;
    
    import javafx.application.Application;
    import javafx.fxml.FXMLLoader;
    import javafx.scene.Parent;
    import javafx.scene.Scene;
    import javafx.scene.image.Image;
    import javafx.stage.Stage;
    
    import java.io.IOException;
    import com.example.javafx03.HelloController;
    public class HelloApplication extends Application {
        @Override
        public void start(Stage stage) throws IOException {
            FXMLLoader loader = new FXMLLoader(getClass().getResource("hello-view.fxml"));
            Parent root = loader.load();
            HelloController controller =  loader.getController();
            stage.setScene(new Scene(root));
             //todo  将stage传入controller
            controller.setStage(stage);
            stage.setResizable(false);
            stage.show();
        }
    
        public static void main(String[] args) {
            launch();
        }
    }
    -----------------------------------------------------------------------------------------
    package com.example.javafx03;
    
    import javafx.fxml.FXML;
    import javafx.fxml.Initializable;
    import javafx.scene.control.ChoiceBox;
    import javafx.scene.input.MouseEvent;
    import javafx.scene.text.Text;
    import javafx.stage.Stage;
    
    import java.net.URL;
    import java.util.ResourceBundle;
    
    public class HelloController implements Initializable {
     private Stage Stage;
     //todo 设置stage 方法
      public void setStage(Stage stage) {
          this.Stage = stage;
      }
    
    
        @FXML
        private ChoiceBox<String> choiceBox;
    
        @FXML
        private Text text;
    
    
        @Override
        public void initialize(URL url, ResourceBundle resourceBundle) {
            choiceBox.getItems().add("Apple");
            choiceBox.getItems().add("Banana");
            choiceBox.getItems().add("Strawberry");
    
            choiceBox.setOnAction(actionEvent -> text.setText("You chose: " + choiceBox.getValue()));
        }
    }
    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值