初始化javafx'的默认值;使用spring boot@configuration和@Value的文本字段
最初,我有一个简单的spring引导项目,其中有一个名为DemoConfig.java的配置文件,如下所示:初始化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
@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()
方法中设置文本;调用时,您的依赖项将被注入。