You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaFX登录表单登录成功后主窗口打开,原登录窗口未关闭的解决咨询

问题:JavaFX登录成功后主窗口打开,但登录窗口未关闭

我用Scene Builder做了一个简单的登录表单,登录功能正常,但输入正确用户名和密码打开主窗口后,登录窗口还一直开着。请问该怎么关闭登录窗口?

相关代码如下:

DomaciFinal.java

@Override
public void start(Stage stage) {
    try {
        Parent root = FXMLLoader.load(getClass().getResource("Login.fxml"));
        Scene scene = new Scene(root);
        stage.setScene(scene);
        stage.show();
    } catch (IOException ex) {
        System.out.println(ex);
    }
}

/**
 * @param args the command line arguments
 */
public static void main(String[] args) {
    launch(args);
}

MainController.java

public class MainController {
    @FXML
    private Label lblStatus;
    @FXML
    private TextField txtUserName;
    @FXML
    private TextField txtPassword;

    public void Login(ActionEvent event) throws Exception {
        if (txtUserName.getText().equals("user") && txtPassword.getText().equals("pass")) {
            lblStatus.setText("Uspešno ste ulogovani.");
            Stage primaryStage = new Stage();
            Parent root = FXMLLoader.load(getClass().getResource("Main.fxml"));
            Scene scene = new Scene(root);
            primaryStage.setScene(scene);
            primaryStage.show();
        } else {
            lblStatus.setText("Neispravni podaci.");
        }
    }
}

提前感谢解答!


解决方案

这问题挺常见的,其实只要在登录成功后获取到登录窗口对应的Stage对象,调用它的close()方法就能解决啦。具体修改步骤如下:

  1. 首先,在你的Login方法里,通过传入的ActionEvent获取触发登录操作的控件(比如你的登录按钮),再通过这个控件找到它所属的登录窗口:

    // 获取触发登录事件的控件
    Node source = (Node) event.getSource();
    // 从控件拿到所在的Scene,再获取对应的Stage
    Stage loginStage = (Stage) source.getScene().getWindow();
    
  2. 然后在你打开主窗口的代码之后,调用loginStage.close()就能关闭登录窗口了。

修改后的完整Login方法代码如下:

public void Login(ActionEvent event) throws Exception {
    if (txtUserName.getText().equals("user") && txtPassword.getText().equals("pass")) {
        lblStatus.setText("Uspešno ste ulogovani.");
        // 初始化并显示主窗口
        Stage primaryStage = new Stage();
        Parent root = FXMLLoader.load(getClass().getResource("Main.fxml"));
        Scene scene = new Scene(root);
        primaryStage.setScene(scene);
        primaryStage.show();
        
        // 获取登录窗口并关闭
        Node source = (Node) event.getSource();
        Stage loginStage = (Stage) source.getScene().getWindow();
        loginStage.close();
    } else {
        lblStatus.setText("Neispravni podaci.");
    }
}

另外补充个小细节:如果你只是想暂时隐藏登录窗口而不是彻底关闭(不过登录成功后一般都是直接关闭更合理),可以把loginStage.close()换成loginStage.hide(),两者的区别是hide()只是把窗口藏起来,对象还在内存里;close()则会销毁窗口资源,更符合登录场景的需求。

这样改完之后,你再测试登录,成功打开主窗口的同时,登录窗口就会自动关闭啦!

内容的提问来源于stack exchange,提问作者Arcibald Rajs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:21:38