You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaFX开发中如何获取另一个控制器类中创建的实例

问题原因分析
  • Auto类的merk、prijs属性被错误声明为static,静态属性属于类本身而非实例,会导致所有Auto对象共享同一个属性值,不符合业务需求
  • 你在AutoController的构造方法中操作FXML注入的Merk、Prijs控件:FXMLLoader创建控制器实例时,会先调用构造方法,之后才会完成FXML控件的注入,此时控件还处于null状态,直接调用会抛出空指针异常
  • 用静态变量跨控制器传值是非常不规范的做法,耦合度极高,也不符合JavaFX的设计规范
  • 额外注意:FXML文件中对应的控件fx:id要和控制器里的变量名完全一致,按钮的onAction属性也要和绑定的方法名匹配,不然会出现注入失败的问题
修复方案

1. 修复Auto类

移除属性的static修饰符:

package com.example.test1;

public class Auto {
    private String merk;
    private double prijs;

    public Auto(String merk, double prijs) {
        this.merk = merk;
        this.prijs = prijs;
    }

    public String getMerk() {
        return merk;
    }

    public double getPrijs() {
        return prijs;
    }
}

2. 修复主Controller

移除auto的static修饰符,加载FXML时手动获取AutoController实例并传入auto对象:

import java.io.IOException;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.stage.Stage;

public class Controller {

    public Label random;
    public Button btn1;
    public Auto auto;

    public void maakNieuweAuto() {
        auto = new Auto("bmw", 900);
    }

    public void button() throws IOException {
        // 手动创建FXMLLoader实例,不要使用静态load方法
        FXMLLoader loader = new FXMLLoader(getClass().getResource("Auto.fxml"));
        Parent root = loader.load();
        // 获取AutoController实例
        AutoController autoController = loader.getController();
        // 把auto对象传递给AutoController
        autoController.setAuto(auto);

        Stage window = (Stage) btn1.getScene().getWindow();
        window.setScene(new Scene(root, 750, 500));
    }
}

3. 修复AutoController

删除构造方法里的控件赋值逻辑,新增接收Auto对象的公共方法,等参数接收完成后再操作控件:

package com.example.test1;

import javafx.fxml.FXML;
import javafx.scene.text.Text;

public class AutoController {

    @FXML
    public Text Merk;
    @FXML
    public Text Prijs;

    private Auto auto;

    // 提供接收Auto对象的公共方法
    public void setAuto(Auto auto) {
        this.auto = auto;
        updateUI();
    }

    private void updateUI() {
        Merk.setText(auto.getMerk());
        Prijs.setText(String.valueOf(auto.getPrijs()));
    }
}

内容的提问来源于stack exchange,提问作者Mateo04

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 05:57:01