MTextField粘贴自动拆分异常:删除字段后触碰首字段内容复现
问题分析与解决方案
异常核心原因
你遇到的问题本质是视图(MTextField)与数据模型(DoField)状态不同步:
粘贴操作时,你会同时更新DoField和MTextField,但手动删除第二、第三个文本框内容时,并没有同步清空对应的secondDoField、thirdDoField。此时模型里仍保留着1234这类旧值,当鼠标触碰第一个文本框触发组件焦点刷新、视图与模型同步时,框架会把模型里的旧值重新渲染到第二个文本框中。
另外你的KeyListener存在冗余:keyPressed和keyReleased都调用了拆分方法,但粘贴操作完成后文本框内容才会更新,keyPressed阶段获取的文本是粘贴前的旧值,虽不是当前异常的直接原因,但会导致不必要的重复处理。
修复方案
- 同步视图与模型的双向更新
给第二、第三个MTextField添加内容修改监听器,当用户手动修改文本时同步更新对应模型,确保两者状态一致:
secondTextField.addModifyListener(e -> { updateDoField(secondDoField, secondTextField.getText()); }); thirdTextField.addModifyListener(e -> { updateDoField(thirdDoField, thirdTextField.getText()); });
- 优化粘贴事件的处理逻辑
仅在keyReleased阶段处理粘贴操作,避免重复调用,同时通过异步执行确保获取到粘贴后的最新文本:
@Override public void keyPressed(KeyEvent e) { // 移除此处的拆分调用 } @Override public void keyReleased(KeyEvent e) { if ((e.keyCode == KeyIdentifier.V_KEYCODE) && (e.stateMask == KeyIdentifier.CTRL_MASK)) { Display.getDefault().asyncExec(() -> { splitInputString(firstTextField.getText()); }); } }
- 添加字符串边界安全检查
在拆分方法中处理输入长度不足的情况,避免substring抛出异常:
public void splitInputString(String input) { input = input.replace("some replacements", ""); String firstPart = input.length() >= 2 ? input.substring(0, 2) : input; String secondPart = input.length() >=6 ? input.substring(2, 6) : (input.length() >2 ? input.substring(2) : ""); String thirdPart = input.length() >=14 ? input.substring(6, 14) : (input.length() >6 ? input.substring(6) : ""); updateDoField(firstDoField, firstPart); updateDoField(secondDoField, secondPart); updateDoField(thirdDoField, thirdPart); updateMTextField(firstTextField, firstPart); updateMTextField(secondTextField, secondPart); updateMTextField(thirdTextField, thirdPart); }
- 检查框架绑定机制
如果你的MTextField与DoField是通过框架自带的双向绑定实现,确认绑定配置为双向同步,而非仅从模型到视图的单向同步,可直接利用框架绑定避免手动更新的冗余操作。
内容的提问来源于stack exchange,提问作者Frevelman
相关产品推荐
相关产品推荐

