我在fxml文件中声明了一些JavaFX组件。
如何在按下按钮时获取字段的值(用户名,密码)? (执行登录)。
Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
stage.setTitle("Login");
stage.setScene(new Scene(root,400,300));
stage.show();
或者这是完全错误的做法吗?
我的问题:
编辑: https://hastebin.com/qexipogoma.xml< - 我的FXML fie和我的控制器
答案 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 );
文档:
编辑: 以这种方式声明ids
<TextField fx:id="myTxtID" ... />
答案 2 :(得分:0)
尝试使用SceneBuilder。它将生成一个FXML文件和一个兼容的控制器。这将给你一个良好的开端。