JavaFX 不同页面之间的数据传递方案
在使用 JavaFX 开发项目时,经常会遇到需要在不同页面之间传递数据的情况。本文将介绍一种简单有效的方案,以实现在 JavaFX 不同页面之间传递数据的需求。
方案概述
该方案的核心思想是利用一个全局的数据管理类,将需要传递的数据存储在该类中,然后在不同页面之间通过该类来获取和设置数据。具体实现方式如下:
- 创建一个名为
DataManager
的数据管理类,用于存储需要传递的数据。
public class DataManager {
private static DataManager instance;
private String data;
private DataManager() {
// 私有构造函数,防止外部创建新实例
}
public static DataManager getInstance() {
if (instance == null) {
instance = new DataManager();
}
return instance;
}
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
}
}
- 在需要传递数据的页面中,通过
DataManager
类来设置和获取数据。
public class Page1Controller {
@FXML
private TextField textField;
@FXML
private void goToPage2(ActionEvent event) throws IOException {
String data = textField.getText();
DataManager.getInstance().setData(data);
// 导航到 Page2 页面
FXMLLoader loader = new FXMLLoader(getClass().getResource("Page2.fxml"));
Parent root = loader.load();
Scene scene = new Scene(root);
Stage stage = (Stage) ((Node) event.getSource()).getScene().getWindow();
stage.setScene(scene);
stage.show();
}
}
- 在目标页面中,同样通过
DataManager
类来获取需要传递的数据。
public class Page2Controller {
@FXML
private Label label;
@FXML
private void initialize() {
String data = DataManager.getInstance().getData();
label.setText(data);
}
}
代码解析
上述方案中,我们使用了一个单例模式的 DataManager
类来进行数据的存储和获取。通过将需要传递的数据存储在 DataManager
类的 data
字段中,我们可以在不同页面之间共享这份数据。
在 Page1Controller
类中的 goToPage2
方法中,我们首先通过 DataManager.getInstance().setData(data)
将数据存储到 DataManager
类中。然后,我们使用 FXMLLoader
类来加载 Page2.fxml
页面,并将其设置为新的场景。最后,我们将新场景显示出来,完成页面导航的过程。
在 Page2Controller
类的 initialize
方法中,我们通过 DataManager.getInstance().getData()
方法来获取在 Page1Controller
中存储的数据,并将其显示在 label
控件中。
使用示例
下面是一个简单的使用示例,展示了如何在两个页面之间传递数据。
Page1.fxml
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.VBox?>
<VBox alignment="CENTER" spacing="10" xmlns="
xmlns:fx=" fx:controller="Page1Controller">
<TextField fx:id="textField" promptText="Enter data" />
<Button text="Go to Page 2" onAction="#goToPage2" />
</VBox>
Page2.fxml
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.VBox?>
<VBox alignment="CENTER" spacing="10" xmlns="
xmlns:fx=" fx:controller="Page2Controller">
<Label fx:id="label" />
</VBox>
Main.java
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
import java.io.IOException;
public class Main extends Application {
@Override
public void start(Stage primaryStage) throws IOException {
Parent root = FXMLLoader.load(getClass().getResource("Page1.fxml"));
primaryStage.setScene(new Scene(root));
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
Page1Controller.java
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml