为啥要这么做?
-
问和操作 Stage 对象: 在 JavaFX 应用程序中,
Stage
对象是顶层容器,它代表应用程序窗口。通过将Stage
引用传递给控制器,你可以直接从控制器中访问和操作窗口,例如:- 改变窗口的标题。
- 调整窗口的大小。
- 设置窗口的图标。
- 控制窗口的显示和隐藏。
- 监听窗口的关闭事件。
-
实现全屏模式: 如果你需要在应用程序中实现全屏模式,可以通过
Stage
对象的setFullScreen
方法来实现。 -
模态对话框: 你可能需要在应用程序中显示模态对话框(例如,输入对话框、确认对话框等)。这需要创建一个新的
Stage
作为对话框,并通过主Stage
来控制其模态行为。 -
跨场景传递数据: 当你需要在不同的场景(Scene)之间传递数据时,可以将
Stage
作为中介来存储和传递这些数据。 -
集中管理窗口: 在多窗口应用程序中,通过在控制器中访问
Stage
,可以更方便地管理多个窗口,例如,确保只有一个窗口实例是打开的,或者关闭所有打开的窗口。 -
自定义窗口行为: 有时你可能需要自定义窗口的行为,比如拖动窗口的特定部分来移动窗口,这需要直接操作
Stage
。 -
响应窗口事件: 你可能需要响应窗口的某些事件,如窗口关闭、图标化、最大化等,这需要通过
Stage
的相应事件监听器来实现。 -
//将 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())); } }