首页 > 解决方案 > 如果在之后更改场景,则标签的 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);
        }
    }

标签: javafx

解决方案


基本上,文本正在改变。问题是一旦文本更改,您就会加载下一个视图。这发生得非常快。解决方案是放慢速度。主要是在加载新视图之前给用户时间来查看文本的变化。这可以使用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();

推荐阅读