Javafx - 如何访问FXML"对象"

时间:2017-08-24 14:39:44

标签: java javafx

我在fxml文件中声明了一些JavaFX组件。

The Frame

如何在按下按钮时获取字段的值(用户名,密码)? (执行登录)。

  Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
  stage.setTitle("Login");
  stage.setScene(new Scene(root,400,300));
  stage.show();

或者这是完全错误的做法吗?

我的问题:

  1. 在fxml文件中声明所有字段是个好主意吗?
  2. 如何让对象访问值?
  3. 如果它是完全错误的方式,怎么办呢? (我想使用scenebuilder)
  4. 编辑: https://hastebin.com/qexipogoma.xml< - 我的FXML fie和我的控制器

3 个答案:

答案 0 :(得分:3)

  

在fxml文件中声明所有字段是个好主意吗?

这取决于您的需求。在这种情况下,您无需动态添加/删除场景的任何部分。您可能会在成功登录后替换窗口/场景。通过fxml创建此场景应该没有任何问题。

  

如何让对象访问值?

使用带有fxml的控制器并通过此控制器访问值。

<AnchorPane fx:controller="mypackage.LoginController" ...>
   <children>
      ...
      <TextField fx:id="username" ... />
      ...
      <PasswordField fx:id="password" ... />
      ...
      <Button onAction="#login" ... />
   </children>
</AnchorPane>
package mypackage;

...

public class LoginController {

    private boolean login = false;

    @FXML
    private TextField username;

    @FXML
    private PasswordField password;

    @FXML
    private void login() {
        // regular close the login window
        login = true;
        password.getScene().getWindow().hide();
    }

    public String getUsername() {
        return username.getText();
    }

    public String getPassword() {
        return password.getText();
    }

    public boolean isLogin() {
        return login;
    }

    public void resetLogin() {
        // allow reuse of scene for invalid login data
        login = false;
    }

}
FXMLLoader loader = new FXMLLoader(getClass().getResource("sample.fxml"));
Stage stage = new Stage(new Scene(loader.load()));
LoginController controller = loader.getController();

boolean loginSuccess = false;

stage.showAndWait();

if (controller.isLogin()) {
    if (checkLogin(controller.getUsername(), controller.getPassword())) {
        // handle login success
    } else {
        // handle invalid login
    }
}

答案 1 :(得分:1)

Scene scene = stage.getScene();
Button btn = (Button) scene.lookup("#myBtnID");
TextField txt = (TextField ) scene.lookup("#myTxtID");
你正在寻找:

txt.getText();

btn.setOnAction( lambda here );

文档:

Button

TextField

编辑: 以这种方式声明ids

<TextField fx:id="myTxtID" ...  />

答案 2 :(得分:0)

尝试使用SceneBuilder。它将生成一个FXML文件和一个兼容的控制器。这将给你一个良好的开端。