JavaFX子窗口父窗口值传递教程

介绍

在JavaFX应用程序中,我们经常会遇到子窗口需要获取或修改父窗口值的情况。比如,一个窗口中有一个按钮,点击该按钮后会弹出一个子窗口,子窗口需要获取父窗口中的某个输入框的值。本教程将指导你如何实现JavaFX子窗口父窗口值的传递。

流程

下面是整个过程的流程图,以便更好地理解这个过程:

erDiagram
    ParentWindow --> ChildWindow : 打开子窗口
    ChildWindow --> ParentWindow : 获取或修改父窗口的值

实现步骤

下面是实现这个功能的步骤:

步骤 描述
1. 创建父窗口 创建一个JavaFX父窗口,包含一个输入框和一个按钮。
2. 创建子窗口 创建一个JavaFX子窗口,用于获取或修改父窗口的值。
3. 设置子窗口模态 将子窗口设置为模态,以确保用户完成对子窗口的操作后才能返回父窗口。
4. 获取父窗口值 子窗口通过调用父窗口的公共方法或获取父窗口的成员变量来获取父窗口的值。
5. 修改父窗口值 子窗口通过调用父窗口的公共方法或设置父窗口的成员变量来修改父窗口的值。

下面我们逐步详细说明每个步骤应该如何实现。

1. 创建父窗口

首先,我们需要创建一个JavaFX父窗口,其中包含一个输入框和一个按钮。以下是一个简单的示例代码:

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class ParentWindow extends Application {
    
    private TextField inputField;
    
    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) {
        primaryStage.setTitle("Parent Window");
        
        inputField = new TextField();
        Button openChildWindowButton = new Button("Open Child Window");
        openChildWindowButton.setOnAction(e -> openChildWindow());
        
        VBox layout = new VBox(10);
        layout.setPadding(new Insets(10));
        layout.getChildren().addAll(inputField, openChildWindowButton);
        
        primaryStage.setScene(new Scene(layout, 300, 200));
        primaryStage.show();
    }
    
    private void openChildWindow() {
        // TODO: 打开子窗口,并传递父窗口的值
    }
}

在上面的代码中,我们创建了一个名为ParentWindow的JavaFX应用程序类。在start方法中,我们创建了一个父窗口,其中包含一个输入框和一个按钮。当按钮被点击时,我们将要在openChildWindow方法中实现的打开子窗口的逻辑。

2. 创建子窗口

接下来,我们需要创建一个JavaFX子窗口,用于获取或修改父窗口的值。以下是一个简单的示例代码:

import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.VBox;
import javafx.stage.Modality;
import javafx.stage.Stage;

public class ChildWindow {
    
    private Stage stage;
    private ParentWindow parentWindow;
    
    public ChildWindow(ParentWindow parentWindow) {
        this.parentWindow = parentWindow;
        
        stage = new Stage();
        stage.initModality(Modality.APPLICATION_MODAL);
        stage.setTitle("Child Window");
        
        Label valueLabel = new Label(parentWindow.getInputValue());
        Button updateButton = new Button("Update Value");
        updateButton.setOnAction(e -> updateParentValue());
        
        VBox layout = new VBox(10);
        layout.getChildren().addAll(valueLabel, updateButton);
        
        stage.setScene(new Scene(layout, 200, 150));
    }
    
    public void show() {
        stage.showAndWait();
    }
    
    private void updateParentValue() {
        String newValue = "New Value";
        parentWindow.setInputValue(newValue);