JavaFX 不同页面之间的数据传递方案

在使用 JavaFX 开发项目时,经常会遇到需要在不同页面之间传递数据的情况。本文将介绍一种简单有效的方案,以实现在 JavaFX 不同页面之间传递数据的需求。

方案概述

该方案的核心思想是利用一个全局的数据管理类,将需要传递的数据存储在该类中,然后在不同页面之间通过该类来获取和设置数据。具体实现方式如下:

  1. 创建一个名为 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;
    }
}
  1. 在需要传递数据的页面中,通过 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();
    }
}
  1. 在目标页面中,同样通过 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