Java GUI计算器:如何在光标所在TextField插入文本
Java GUI计算器:向当前焦点文本框追加数字的实现方案
第一步:维护当前活跃的文本框实例
给左右两个TextField添加焦点监听器,在文本框获得焦点时,把它记录到一个全局变量里,避免每次点击按钮时重复判断焦点状态:// 全局变量,记录当前有焦点的文本框 private JTextField activeInputField; // 初始化文本框时添加焦点监听 private void initTextFields() { JTextField leftField = new JTextField(); JTextField rightField = new JTextField(); // 左侧文本框焦点监听 leftField.addFocusListener(new FocusAdapter() { @Override public void focusGained(FocusEvent e) { activeInputField = leftField; } }); // 右侧文本框焦点监听 rightField.addFocusListener(new FocusAdapter() { @Override public void focusGained(FocusEvent e) { activeInputField = rightField; } }); // 默认设置左侧为初始活跃文本框 activeInputField = leftField; }第二步:数字按钮的点击逻辑
在数字按钮的ActionListener里,直接调用之前维护的activeInputField完成文本追加(也支持插入到光标当前位置):// 以0按钮为例 JButton a0 = new JButton("0"); a0.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if (activeInputField != null) { // 方案1:追加到文本末尾 String currentText = activeInputField.getText(); activeInputField.setText(currentText + "0"); // 可选:把光标移到新文本的末尾 activeInputField.setCaretPosition(activeInputField.getText().length()); // 方案2:插入到光标当前位置(更符合常规输入习惯) // activeInputField.insert("0", activeInputField.getCaretPosition()); } } });问题排查说明
之前用if-else直接判断焦点失败,核心原因是点击按钮时,按钮会抢走焦点,导致文本框的hasFocus()返回false。用焦点监听提前记录活跃框的方式,就能避开这个问题——文本框获得焦点时的状态已经被提前存储,不受后续按钮抢焦点的影响。
内容的提问来源于stack exchange,提问作者Jimmy McGill
相关产品推荐
相关产品推荐

