Java中调用afficherJframe()时JLabel无法显示的问题
解决JLabel无法显示的问题
问题出在afficherJframe()方法里的Thread.sleep(3000)——这行代码会直接阻塞事件调度线程(EDT)。Swing的UI渲染和事件处理都依赖EDT,一旦被阻塞,JFrame虽然被设置为可见,但UI组件(包括你的JLabel)根本来不及完成渲染,3秒后窗口直接被关闭,自然看不到标签内容。
解决方法是用Swing自带的Timer来实现延迟关闭,它不会阻塞EDT,能让UI正常渲染:
import javax.swing.Timer; public class attrape_ball { JFrame frame = new JFrame(); JPanel attrape = new JPanel(); public attrape_ball(pokeball pk) { JLabel ramasseball = new JLabel("vous avez ramasser "); attrape.add(ramasseball); frame.setSize(200,100); frame.add(attrape); frame.setVisible(false); } @Override public void afficherJframe() { frame.setVisible(true); // 用Timer实现3秒后关闭窗口 Timer timer = new Timer(3000, e -> { frame.dispose(); }); timer.setRepeats(false); // 只执行一次 timer.start(); } }
关键说明:
Timer会在EDT中异步执行延迟任务,不会阻碍UI组件的渲染过程,JLabel能正常显示。setRepeats(false)确保定时器只触发一次关闭操作。
内容的提问来源于stack exchange,提问作者Thibaud Zobel
相关产品推荐
相关产品推荐

