初始化javafx'的默认值;使用spring boot@configuration和@Value的文本字段

初始化javafx'的默认值;使用spring boot@configuration和@Value的文本字段,java,spring,javafx,Java,Spring,Javafx,最初,我有一个简单的spring引导项目,其中有一个名为DemoConfig.java的配置文件,如下所示: @Configuration @PropertySource("classpath:application.properties") public class DemoConfig { @Value("${deviceName}") private String deviceName; @Value("${platformName}") private

最初,我有一个简单的spring引导项目,其中有一个名为DemoConfig.java的配置文件,如下所示:

@Configuration
@PropertySource("classpath:application.properties")
public class DemoConfig
{
    @Value("${deviceName}")
    private String deviceName;

    @Value("${platformName}")
    private String platformName;

    @Value("${platformVersion}")
    private String platformVersion;

    @Value("${appPackage}")
    private String appPackage;

    @Value("${appActivity}")
    private String appActivity;
现在我想将javafx应用到我的项目中,以某种方式启动一个配置页面,供用户配置这些值。因此,我将这个DemoController.java用作fx:controller

@Component
public class DemoController
{
    @Resource
    private DemoConfig demoConfig;

    public TextField platformName = new TextField(demoConfig.getPlatformName());

    public TextField platformVersion = new TextField(demoConfig.getPlatformVersion());

    public TextField deviceName = new TextField(demoConfig.getDeviceName());

    public TextField appActivity = new TextField(demoConfig.getAppActivity());

    public TextField appPackage = new TextField(demoConfig.getAppPackage());

}
现在我的结论是:DemoController的初始化将失败,因为DemoConfig还没有作为bean注入,我有点困惑如何将控制器与我的配置类结合起来。 我的目标很简单,就是用bean DemoConfig的值初始化控制器的textfield。
任何想法都会有帮助!谢谢

EDIT:我的回答没有考虑FXML。在答案被接受后,所有学分都将交给James_D进行有效评论

使用FXML时(首选) 从评论中:


如果这是FXML文件的控制器,则不应 实例化所有的文本字段。如果它们是在FXML中声明的 文件,FXMLLoader将实例化它们并将它们注入 控制器。只需在控制器的initialize()方法中设置文本; 调用时,您的依赖项将被注入 詹姆斯·杜德

不考虑FXML 使用@PostConstruct: 这应该确保您的bean被注入(如果没有其他问题)

将所有文本字段初始化放在postconstruct中:

@Component
public class DemoController
{
    @Autowire
    private DemoConfig demoConfig;

    public TextField platformName;

    public TextField platformVersion;

    public TextField deviceName;

    public TextField appActivity;

    public TextField appPackage;


    @PostConstruct
    private void postConstruct() {
        platformName = new TextField(demoConfig.getPlatformName());

        platformVersion = new TextField(demoConfig.getPlatformVersion());

        deviceName = new TextField(demoConfig.getDeviceName());

        appActivity = new TextField(demoConfig.getAppActivity());

        appPackage = new TextField(demoConfig.getAppPackage());
    }

}

这是不正确的。如果将其用作相关FXML文件的控制器,
FXMLLoader
将实例化文本字段并将其插入控制器。这里的
@PostConstruct
方法是完全冗余的;如果设置正确,在加载FXML文件时,该方法中构造的文本字段将立即替换为新字段。@James_D是正确的,
@PostConstruct
此处不需要。@AbinashGhosh此外,在类中的任何位置,此处都不需要初始化文本字段。基本上,这是一个示例。我最好的猜测是FXML文件中出现了错误,当OP尝试在文本字段上设置文本时,会导致空指针异常。他们没有询问如何解决这个问题,而是尝试实例化控制器中的文本字段(这是不正确的),现在询问有关错误解决方案的问题,而不是询问解决原始问题的问题(我们没有足够的信息来回答)。在他的问题中没有提到FXML。因为他已经接受了,我不能再删除答案了。我将添加您的注释James。如果这是FXML文件的控制器,那么您根本不应该实例化文本字段。如果它们在FXML文件中声明,则
FXMLLoader
将实例化它们并将它们注入控制器。只需在控制器的
initialize()
方法中设置文本;调用时,您的依赖项将被注入。