Swing JTextField问题:输入ADMIN触发密码框遇ActionListener异常
解决JTextField实时检测输入并触发密码框的问题
嘿,我明白你的需求了——你想在用户输入"ADMIN"的时候自动显示密码输入框,但现在用txtUsuario.addActionListener达不到实时检测的效果对吧?
问题根源
ActionListener绑定在JTextField上时,只有当用户按下回车键才会触发回调,而你需要的是实时监听输入内容的每一次变化,所以得换用DocumentListener来实现这个需求。
修正后的完整代码
我把你的代码补全并修改了关键部分,你可以直接参考:
package FP.Graphics; import java.awt.BorderLayout; import java.awt.EventQueue; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.border.EmptyBorder; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import javax.swing.BoxLayout; import javax.swing.JTextField; import javax.swing.JPasswordField; import javax.swing.JButton; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; public class LoginFrame extends JFrame { private JPanel contentPane; private JTextField txtUsuario; private JPasswordField pwdField; // 密码输入框 public static void main(String[] args) { EventQueue.invokeLater(() -> { try { LoginFrame frame = new LoginFrame(); frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } }); } public LoginFrame() { setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(100, 100, 450, 300); contentPane = new JPanel(); contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); setContentPane(contentPane); contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.Y_AXIS)); // 创建用户名输入框 txtUsuario = new JTextField(); contentPane.add(txtUsuario); txtUsuario.setColumns(10); // 创建密码输入框,初始隐藏 pwdField = new JPasswordField(); pwdField.setVisible(false); pwdField.setColumns(10); contentPane.add(pwdField); // 添加登录按钮(保留你的原有组件逻辑) JButton btnLogin = new JButton("登录"); btnLogin.addActionListener(e -> { String user = txtUsuario.getText(); String pwd = new String(pwdField.getPassword()); System.out.println("用户:" + user + ",密码:" + pwd); }); contentPane.add(btnLogin); // 核心逻辑:给文本框的Document添加监听器,实时检测输入 txtUsuario.getDocument().addDocumentListener(new DocumentListener() { @Override public void insertUpdate(DocumentEvent e) { checkAdminInput(); } @Override public void removeUpdate(DocumentEvent e) { checkAdminInput(); } @Override public void changedUpdate(DocumentEvent e) { checkAdminInput(); } // 封装检测逻辑,避免重复代码 private void checkAdminInput() { String input = txtUsuario.getText().trim(); // 当输入等于"ADMIN"时显示密码框,否则隐藏 pwdField.setVisible("ADMIN".equals(input)); // 刷新界面布局,避免组件位置错乱 contentPane.revalidate(); contentPane.repaint(); } }); } }
关键说明
DocumentListener会监听文本框内容的每一次插入、删除、修改,完美实现实时检测的需求- 把检测逻辑封装到
checkAdminInput方法里,三个回调方法统一调用,减少重复代码 - 当输入完全匹配"ADMIN"时,自动显示密码框;如果需要忽略大小写,可以改成
"ADMIN".equalsIgnoreCase(input) - 调用
revalidate()和repaint()是为了确保界面组件布局能及时更新,避免出现显示异常
这样修改后,用户输入"ADMIN"的过程中,只要内容完全匹配,密码框就会自动弹出,完全符合你的需求啦!
内容的提问来源于stack exchange,提问作者Raul Pereyra
相关产品推荐
相关产品推荐

