当前位置: 首页 > 知识库问答 >
问题:

FXML:“初始化后运行”

熊哲圣
2023-03-14

我有一个JavaFX应用程序,它与用Java编写的控制器类一起使用FXML。在Java控制器中,在FXML节点初始化之前,我需要小心不要对其进行操作(否则我会得到一个NullPointerException),这在运行初始化方法之前是无法保证的。所以我发现自己经常这样做:

控制器在FXML文件中设置如下:

<Pane fx:controller="Controller" ...>
...
</Pane>

然后是Java文件中的控制器。

class Controller{
    @FXML
    Pane aPane;
    int globalValue;

    public void setSomething(int value){
        globalValue = value;
        if(!(aPane == null)){  //possibly null if node not initialized yet
            aPane.someMethod(globalValue)
        }
    }

    @FXML
    void initialize(){
        aPane.someMethod(globalValue) //guaranteed not null at this point
    }


}

这是可行的,但它笨重且重复。我必须创建globalValue属性,以防在调用初始化方法之前调用setSomething方法,并且我必须确保setSomething方法中的操作与初始化方法中的操作相同。

当然,有一种更优雅的方法可以做到这一点。我知道JavaFX有平台。稍后运行(…) 方法,该方法保证某些内容将在主应用程序线程上运行。也许有类似于平台的东西。runAfterInitialize(…) 等待初始化,如果初始化已经发生,则立即运行?或者如果有其他方法,我愿意接受建议。


共有1个答案

戈建白
2023-03-14
匿名用户

如果在FXML文件中使用fx:controller=“controller”指定控制器,则在调用FXMLLoader时。加载(…) ,FXMLLoader:

  1. 解析FXML文件

只有在load()完成后(即注入带注释的字段后),才能获得对带有loader的控制器的引用。getController()。因此,在初始化注入的FXML字段之前,您不可能(除了在控制器工厂实现中执行一些极不寻常的操作之外)调用控制器实例上的任何方法。此处的空检查是多余的。

另一方面,如果使用FXMLLoader。setController(…)要初始化控制器,在这种情况下不能使用fx:controller,可以将值传递给构造函数。在将控制器传递给FXML加载器之前,只需避免在控制器上调用set方法,就意味着您可以假设任何FXML注释字段都是在控制器的公共方法中初始化的:

class Controller{
    @FXML
    Pane aPane;
    int globalValue;

    public Controller(int globalValue) {
        this.globalValue = globalValue ;
    }

    public Controller() {
        this(0);
    }

    public void setSomething(int value){
        globalValue = value;
        aPane.someMethod(globalValue)
    }

    @FXML
    void initialize(){
        aPane.someMethod(globalValue) //guaranteed not null at this point
    }


}

FXMLLoader loader = new FXMLLoader(getClass().getResource("path/to/fxml"));
Controller controller = new Controller(42);
loader.setController(controller);
Node root = loader.load();

 类似资料:
  • 正如标题所述,在构建表并将所有内容添加到表中的initialize方法和FXMLLoader之间存在一定的冲突,FXMLLoader应该为弹出窗口加载FXML。 我的代码: 主要内容: FXML 1。 控制器。 Fxml2: 问题是:如果你删除初始化或注释它-Neu按钮弹出-工作,如果没有-表格显示,但按钮弹出没有,似乎有冲突

  • 我看了这个,这个,还有这个,但遗憾的是,没有一个能解决我的问题。组件总是空的。ID是一样的,但我仍然不知道我做错了什么。下面是我的代码: 应用类。 RootView.fxml 控制器类 应用程序运行正常。我错过了什么吗?

  • 我有我的文件下面: 我也有例子。: 出于某种原因,当我做在我的根目录(不是)我得到错误: 有人能给我解释一下这个错误中的问题吗?这是因为我的依赖项没有正确安装,还是因为其他原因?

  • 我想在部署初始化成功后运行特定的命令。 这是我的yaml文件: 不过,我希望在成功初始化部署并运行POD之后(而不是之前)运行db迁移命令。 我可以为每个pod手动执行(使用kubectl exec),但这不是很好的扩展性。

  • 本文向大家介绍iOS 然后初始化,包括了iOS 然后初始化的使用技巧和注意事项,需要的朋友参考一下 示例 这在语法上类似于使用位置常量进行初始化的示例,但是需要Thenhttps://github.com/devxoul/Then的扩展名(如下所示)。 该Then扩展:            

  • 问题内容: 我试图从一个简单的ArrayList的内容填充ListView。这是我的 Controller.java文件: 这是我的Style.fxml文件: 该程序运行,但是我输入的歌曲没有出现在ListView中(并且Song类确实具有toString方法)。 我能做什么? 问题答案: 问题是没有将控制器的初始化为预期问题的质询者。 Java 8中FXMLLoader的操作有点奇怪。 如果您在