javafx - 如果在之后更改场景,则标签的 Javafx setText 不起作用
问题描述
也许有人会解释。我有一个方法,如果登录成功则设置标签文本。
@FXML
private void loginUser(ActionEvent event) throws IOException {
String user = username.getText();
String pass = password.getText();
if(validateFields(user, pass) && validateLogin(user, pass)) {
welcome.setText("Welcome, " + globalUser.getUserName()); //works
infoLine.setText("Redirecting to main dashboard..."); //works
}
}
如果我添加额外的代码,在登录后改变场景,标签文本不会改变:
@FXML
private void loginUser(ActionEvent event) throws IOException {
String user = username.getText();
String pass = password.getText();
if(validateFields(user, pass) && validateLogin(user, pass)) {
welcome.setText("Welcome, " + CurrentUser.getCurrentUser().getUserName());//not working
infoLine.setText("Redirecting to main dashboard..."); //not working
//Changing scene after successful login
Parent home = FXMLLoader.load(getClass().getResource(ScenePath.HOME.getPath()));
Scene homeScene = new Scene(home);
Stage appStage = (Stage) ((Node) event.getSource()).getScene().getWindow();
appStage.setScene(homeScene);
appStage.show();
}
}
如何解决这个问题呢?
我的控制器类看起来像这样。没什么特别的。经过 2 次验证后,它设置标签文本并更改场景。
public class LoginController {
@FXML
private TextField username;
@FXML
private PasswordField password;
@FXML
private Label infoLine;
@FXML
private Label welcome;
@FXML
private Button exitBtn;
UserDao userDao = new UserDao();
@FXML
private void initialize() {
close();
}
@FXML
private void loginUser(ActionEvent event) throws IOException {
String user = username.getText();
String pass = password.getText();
if(validateFields(user, pass) && validateLogin(user, pass)) {
welcome.setText("Welcome, " + CurrentUser.getCurrentUser().getUserName());
infoLine.setText("Redirecting to main dashboard...");
//Changing scene after successful login
Parent home = FXMLLoader.load(getClass().getResource(ScenePath.HOME.getPath()));
Scene homeScene = new Scene(home);
Stage appStage = (Stage) ((Node) event.getSource()).getScene().getWindow();
appStage.setScene(homeScene);
appStage.show();
}
}
private boolean validateFields(String userName, String password) {
if (userName.isEmpty() || password.isEmpty()) {
infoLine.setText("Username and password can't be empty!");
return false;
}
return true;
}
private synchronized boolean validateLogin(String userName, String password) {
User user = userDao.getConnectedUser(userName, password);
if (user == null) {
infoLine.setText("User not found!");
return false;
}
CurrentUser.setCurrentUser(user);
return true;
}
private void close() {
exitBtn.setOnAction(SceneController::close);
}
}
解决方案
基本上,文本正在改变。问题是一旦文本更改,您就会加载下一个视图。这发生得非常快。解决方案是放慢速度。主要是在加载新视图之前给用户时间来查看文本的变化。这可以使用PauseTransition
.
文本更改后,尝试以下代码。文本更改后,此代码会在加载新视图之前延迟两秒。
PauseTransition pause = new PauseTransition(Duration.seconds(2));
pause.setOnFinished(
e -> {
Parent home = FXMLLoader.load(getClass().getResource(ScenePath.HOME.getPath()));
Scene homeScene = new Scene(home);
Stage appStage = (Stage) ((Node) event.getSource()).getScene().getWindow();
appStage.setScene(homeScene);
appStage.show();
}
);
pause.play();
推荐阅读
- javascript - 对于具有多个会话/房间且每个都使用定时事件的多人游戏来说,正确的设置是什么
- linux - 我的 Linux 中安装了这么多 Python3 包(WSL - Ubuntu)
- python - Python中有没有办法创建用户名和密码菜单,其中用户名和密码通过.txt文件中的信息进行验证?
- ansible - ansible.builtin.copy:: 如何复制多个文件
- html - xampp localhost 没有按原样打开文件
- node.js - node.js - 如果 SQL 字符串中存在表名,则使用插入语句中的正则表达式检索表名
- javascript - 如何将变量从弹出窗口传递到仅使用 JS 打开它的窗口
- json - 如何从 media_share_url 获取 Instagram 帖子的 URL?
- html - 如何在这个 CSS Grid 布局中制作电影的封面照片,即使在高度上也是如此?
- python - Python - 保存地图 - 使用 ArcGIS - “NoneType”对象不可下标