使用fxml字段的JavaFX数据绑定
我已经为LoginForm创建了一个fxml文件以及一个控制器和模型。我尝试用fxml视图绑定模型,这样它就可以显示在TextField上,并且我可以返回输入值,比如SpringMVC。使用下面的代码,数据显示在TextField上,但我无法更改UI上的值 如何使用使用fxml字段的JavaFX数据绑定,java,javafx,javafx-8,javafx-2,Java,Javafx,Javafx 8,Javafx 2,我已经为LoginForm创建了一个fxml文件以及一个控制器和模型。我尝试用fxml视图绑定模型,这样它就可以显示在TextField上,并且我可以返回输入值,比如SpringMVC。使用下面的代码,数据显示在TextField上,但我无法更改UI上的值 如何使用text属性创建可编辑的文本字段?或者我可以说如何将TextField与java模型绑定,以将输入数据发送到控制器 fxml代码: <fx:define> <LoginModel fx:id="loginModel"
text
属性创建可编辑的文本字段?或者我可以说如何将TextField与java模型绑定,以将输入数据发送到控制器
fxml代码:
<fx:define>
<LoginModel fx:id="loginModel" />
</fx:define>
<Label text="Username" />
<TextField fx:id="username" GridPane.columnIndex="1" text="${loginModel.username}" editable="true" />
<Label text="Password" GridPane.rowIndex="1" />
<PasswordField fx:id="password" GridPane.columnIndex="1" GridPane.rowIndex="1" text="${loginModel.password}" />
在控制器中,我的用户名和密码总是为null。绑定
节点
s的属性很可能是错误的方法。这些信息应该从用户界面中获取并放入LoginModel
,而不是反过来。此外,您很可能希望等待用户单击某个按钮或按enter键来提交数据,而不是每次用户在文本字段中键入字母时都这样做
您可能希望您的BeanFactory
为您创建LoginModel
,而不是使用fxmloader
来创建它
final BeanFactory factory = ...
FXMLLoader loader = new FXMLLoader(url);
loader.setControllerFactory(cl -> {
try {
// use spring to create bean
return factory.getBean(cl);
} catch (NoSuchBeanDefinitionException ex) {
// try create non-bean
try {
return cl.newInstance();
} catch(InstantiationException | IllegalAccessException innerEx) {
throw new RuntimeException(innerEx);
}
} catch (Exception ex) {
throw new RuntimeException(ex);
}
});
Parent p = loader.load();
当username.getText()
或null时,您将获得NPE?您必须使用参数将用户名和密码传递给userService。像这个userService.login(用户名,密码)。我在action controller中得到null。
final BeanFactory factory = ...
FXMLLoader loader = new FXMLLoader(url);
loader.setControllerFactory(cl -> {
try {
// use spring to create bean
return factory.getBean(cl);
} catch (NoSuchBeanDefinitionException ex) {
// try create non-bean
try {
return cl.newInstance();
} catch(InstantiationException | IllegalAccessException innerEx) {
throw new RuntimeException(innerEx);
}
} catch (Exception ex) {
throw new RuntimeException(ex);
}
});
Parent p = loader.load();
@Component
@Scope("prototype")
public class LoginController {
@Autowired
private LoginModel loginModel;
@FXML
private TextField username;
@FXML
private PasswordField password;
@FXML
private void login() {
loginModel.login(username.getText(), password.getText());
System.out.println("On login action");
}
}