Java Swing登录窗口布尔值判断失效问题求助
问题原因
你遇到的核心问题是Swing的事件驱动模型和线程执行顺序:
- 当你在
startMenus()里调用loginWindow()显示登录窗口后,main线程会立刻往下执行if (loginFront.authenticated)判断。这时候用户还没点击登录按钮,authenticated还是默认的false,所以这个if分支直接跳过。 - 等你后续点击登录按钮修改
authenticated为true时,那个if语句早就执行完了,自然不会有任何响应。
解决方案
有两种简单的修复方式,根据你的需求选择:
方案1:直接在登录成功的回调里执行逻辑
把System.exit(0)直接放到登录按钮的点击事件中,验证通过后立刻执行:
修改login类的ActionListener代码:
login_btn.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { char[] inputPass = pwd_field.getPassword(); char[] appPass = login.pass.toCharArray(); if (Arrays.equals(inputPass, appPass) && usr.equals(usr_field.getText())) { authenticated = true; frame.dispose(); // 关闭登录窗口 System.exit(0); // 登录成功后直接退出程序 } else { authenticated = false; incorrect.setVisible(true); } } });
方案2:使用模态对话框阻塞main线程
把登录窗口改成模态JDialog,这样调用loginWindow()时,main线程会暂停,直到登录窗口关闭,之后再判断authenticated的值:
- 修改login类的
loginWindow()方法:
public static void loginWindow() { // 用JDialog替代JFrame,设置为模态 JDialog dialog = new JDialog(null, "Login", true); dialog.getContentPane().setBackground(new Color(74, 74, 74)); dialog.getContentPane().setLayout(new MigLayout("", "[grow]", "[grow]")); JPanel panel = new JPanel(); panel.setBackground(new Color(74, 74, 74)); dialog.getContentPane().add(panel, "cell 0 0,grow"); panel.setLayout(null); // 下面的组件创建、添加逻辑和原来完全一致 incorrect.setVisible(false); dialog.setSize(310, 230); dialog.setResizable(false); dialog.setVisible(true); // 这里会阻塞线程,直到对话框关闭 }
- 此时main类的
startMenus()不需要修改,因为loginWindow()会阻塞到窗口关闭,之后再判断authenticated的值就会是你点击按钮后设置的结果。
额外提醒
你的代码里存在类名不一致的问题:menu包下的类叫login,但main类里导入的是menu.loginFront,运行时会报错,需要改成import menu.login;,然后调用login.loginWindow()和login.authenticated。
内容的提问来源于stack exchange,提问作者ghostman1337
相关产品推荐
相关产品推荐

