是否有 javafx.fxml.Initializable 的替代方案来在场景开始时运行代码?

问题描述

主要目标是在加载场景时运行代码,我知道 Initializable 是推荐的解决方案,我一直在使用它,但我遇到的问题是它不利于集成测试。

我的 initialize 方法中的逻辑依赖于以前的场景,所以当我只加载这个屏幕时,我得到了一些 NullPointer 异常,因为一些我期望存在的东西不存在。

我无法模拟任何这些,因为使用 TestFX,初始化方法在设置的第一行 FXMLLoader loader = new FXMLLoader(getClass().getResource("test.fxml")); 上运行。

从那里开始,我会执行 loader.getController(); 来访问生成的控制器并模拟某些类字段和内容,但问题是我无法在 initialize 方法运行之前执行此操作。这是一个 catch 22 情况,因为要访问控制器 javafx.fxml.FXMLLoader 必须运行,但是当它运行时它会自动执行 initialize 方法,否则我需要模拟部分或生成预期信息。

那么,我有哪些选择?有没有办法在没有 Initializable 的情况下在场景开始时运行代码

public class GameScreenController implements Initializable {

    private AppService appService;

    private PlayerService playerService;

    private DirectionService directionService;

    private RoomDirectionService roomDirectionService;

    @FXML
    private javafx.scene.control.Button closeButton;

    @FXML
    private Label goldamount;

    @FXML
    private ImageView player;

    private final BooleanProperty wpressed = new SimpleBooleanProperty(false);
    private final BooleanProperty apressed = new SimpleBooleanProperty(false);
    private final BooleanProperty spressed = new SimpleBooleanProperty(false);
    private final BooleanProperty dpressed = new SimpleBooleanProperty(false);

    @Override
    public void initialize(URL url,ResourceBundle resourceBundle) {
        this.appService = new AppService();
        this.directionService = new DirectionService();
        this.roomDirectionService = new RoomDirectionService(this.directionService);
        this.goldamount.setText(String.valueOf(this.appService.getPlayerState().getGoldamount()));
        this.playerService = new PlayerService(this.player,this.appService,this.roomDirectionService);
        this.playerService.moveX(this.appService.getPlayerState().getSpawnCoordinates()[0]);
        this.playerService.moveY(this.appService.getPlayerState().getSpawnCoordinates()[1]);
...

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)