JTextField#getText()无故返回空字符串偶现问题排查求助
问题根因
你的核心错误是把JTextField的初始化、添加到容器、绑定监听器的逻辑全部写在了paintComponent方法中,这个方法会在Swing界面每次需要重绘时被自动触发(比如窗口拖动、缩放、被其他窗口遮挡后重新显示、甚至控件状态变化都可能触发重绘)。
- 每次重绘都会执行
cuadro1=new JTextField(),直接把之前用户已经输入过内容的旧输入框实例替换成了全新的空输入框 - 每次重绘还会重复向容器中添加输入框、重复绑定焦点监听器,会引发内存泄漏、事件触发异常等更多隐藏问题
- 偶发正常的原因就是你运行程序后如果没有触发任何界面重绘操作,第一次输入后焦点离开时拿到的就是正常内容,一旦触发过重绘,拿到的就是新创建的空输入框的内容
修复方案
把输入框的初始化、布局、添加、监听器绑定的逻辑全部移到LaminaFoco的构造方法里,paintComponent只保留和绘制相关的逻辑即可,修复后的代码示例:
class LaminaFoco extends JPanel{ JTextField cuadro1; JTextField cuadro2; // 构造方法里做初始化 public LaminaFoco() { setLayout(null); cuadro1=new JTextField(); cuadro2=new JTextField(); cuadro1.setBounds(120,10,150,20); cuadro2.setBounds(120,80,150,20); add(cuadro1); add(cuadro2); LanzaFocos foco=new LanzaFocos(); cuadro1.addFocusListener(foco); } @Override public void paintComponent(Graphics g) { super.paintComponent(g); // 这里只保留你自己需要的自定义绘制逻辑,不要放控件操作代码 } private class LanzaFocos extends FocusAdapter{ @Override public void focusLost(FocusEvent e) { String email=cuadro1.getText(); // 剩余代码 } } }
额外注意事项
- Swing的非绘制类控件操作不要放在
paintComponent中执行,这个方法仅用于自定义绘制逻辑 - 空布局
null layout不推荐使用,后续维护适配不同分辨率时会有大量问题,建议使用BorderLayout、FlowLayout等官方提供的布局管理器
内容的提问来源于stack exchange,提问作者Memes
相关产品推荐
相关产品推荐

