Java Swing自定义数字键盘如何避免点击按钮同时输入到两个文本框
Swing数字按钮同时向两个输入框写入内容的解决方案
问题现象
使用Eclipse开发Java Swing简易项目时,点击界面上的数字按钮,内容会同时写入账号输入框JTextField与密码输入框JPasswordField,预期效果为仅向用户当前选中激活的输入框输入对应数字。
异常效果截图:
根因分析
查看现有按钮事件代码,数字按钮的点击监听器中,没有做激活输入框的判断,每次点击都同时对两个输入框执行文本拼接、赋值操作,必然导致两个框同时被写入内容。
问题核心代码片段:
btnNewButton_1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { // 无判断直接给账号框拼接数字 String Enternumber1 = textField.getText()+btnNewButton_1.getText(); textField.setText(Enternumber1); // 无判断直接给密码框拼接数字 String Enternumber2 = passwordField.getText()+btnNewButton_1.getText(); passwordField.setText(Enternumber2); } }
实现方案
核心逻辑:单独维护一个变量记录用户最后选中的输入组件,点击数字按钮时仅向该记录的组件追加内容。
- 类成员位置声明焦点输入框记录变量
JTextComponent是JTextField和JPasswordField的共同父类,可以统一接收两种输入组件实例:
// 存储当前处于激活状态、等待输入的输入框 private JTextComponent activeInput;
- 给两个输入框绑定焦点监听
用户点击选中哪个输入框,就把该输入框实例赋值给activeInput:
// 账号输入框焦点监听 textField.addFocusListener(new FocusAdapter() { @Override public void focusGained(FocusEvent e) { activeInput = textField; } }); // 密码输入框焦点监听 passwordField.addFocusListener(new FocusAdapter() { @Override public void focusGained(FocusEvent e) { activeInput = passwordField; } });
- 重写数字按钮的点击事件逻辑
删除原有同时给两个输入框赋值的代码,改为仅向activeInput追加对应数字,其余0-9数字按钮按相同逻辑修改即可:
btnNewButton_1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { // 未选中任何输入框时不执行输入 if (activeInput == null) { return; } String clickNum = btnNewButton_1.getText(); activeInput.setText(activeInput.getText() + clickNum); } });
可选优化
- 所有数字按钮可以共用同一个通用监听器实例,不用给每个按钮重复写几乎一样的事件代码,减少冗余。
- 界面初始化完成后默认给账号输入框请求焦点,打开窗口就能直接输入账号,不用用户手动点第一次:
frame.addWindowListener(new WindowAdapter() { @Override public void windowOpened(WindowEvent e) { textField.requestFocusInWindow(); activeInput = textField; } });
- 清空、退格类功能按钮也可以基于
activeInput变量实现,仅对当前激活的输入框生效。
内容的提问来源于stack exchange,提问作者Xx_22
相关产品推荐
相关产品推荐

