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()方法就能解决啦。具体修改步骤如下:
首先,在你的
Login方法里,通过传入的ActionEvent获取触发登录操作的控件(比如你的登录按钮),再通过这个控件找到它所属的登录窗口:// 获取触发登录事件的控件 Node source = (Node) event.getSource(); // 从控件拿到所在的Scene,再获取对应的Stage Stage loginStage = (Stage) source.getScene().getWindow();然后在你打开主窗口的代码之后,调用
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
相关产品推荐
相关产品推荐

