【问题标题】:JavaFX data binding with fxml fields与 fxml 字段的 JavaFX 数据绑定
【发布时间】:2018-04-17 03:59:40
【问题描述】:

我已经为 LoginForm 以及一个控制器和模型创建了一个 fxml 文件。我尝试将模型与 fxml 视图绑定,以便它可以显示在 TextField 上,并且我可以取回输入值,例如 Spring MVC。使用下面的代码,TextField 上显示的数据,但我无法更改 UI 上的值。

如何使用text 属性制作可编辑的TextField?或者我可以说如何将 TextField 与 java Model 绑定以将输入数据发送到控制器。

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}" />

Java 代码:

@Component
public class LoginController {

@FXML
private LoginModel loginModel;

@FXML
private TextField username;

@FXML
private PasswordField password;

public void login() {
    System.out.println("loginModel = " + loginModel);
    System.out.println("On login action");
}
}

在控制器中,我总是得到 null 作为用户名和密码。

【问题讨论】:

  • username.getText()null 时你得到 NPE
  • 您必须使用参数将用户名和密码传递给 userService。像这样 userService.login(username,password).
  • 我在动作控制器中得到空值。

标签: java javafx javafx-8 javafx-2


【解决方案1】:

在这里绑定Nodes' 属性很可能是错误的方法。信息应从 UI 中获取并放入LoginModel,而不是相反。此外,您很可能希望等待用户单击某个按钮或按 Enter 来提交数据,而不是每次用户在其中一个 TextFields 中键入一个字母时都这样做。

您可能希望您的BeanFactory 为您创建LoginModel,而不是使用FXMLLoader 来创建它。

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");
    }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多