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
相关产品推荐
相关产品推荐

