为何调用repaint()方法无法触发paintComponent()函数?
问题原因及解决方案
你的代码里repaint()没触发paintComponent(),核心问题是组件添加顺序错误,还有几个细节需要修正,具体如下:
1. 组件添加与窗口可见的顺序颠倒
在构造函数中,你先调用了f.setVisible(true),之后才把Client面板添加到窗口。Swing窗口设置可见后,不会自动检测后续添加的组件,导致你的面板从未被纳入绘制流程。
修复方法:调整顺序,先添加组件再设置窗口可见:
public Client() throws IOException{ f = new JFrame("Bad Ice Cream by - Rotem Hanoch"); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setSize(this.width,this.height); f.setResizable(false); f.setFocusable(false); initBoard(); f.add(this); // 先将面板添加到窗口 f.setVisible(true); // 再设置窗口可见 }
2. paintComponent未调用父类方法
虽然当前你只是打印日志,但Swing的绘制机制依赖父类paintComponent完成背景清除等基础操作,缺失可能导致后续绘制异常。建议补充:
public void paintComponent(Graphics g){ super.paintComponent(g); // 调用父类绘制方法 System.out.println("hello"); }
3. 线程操作的规范优化
run()方法中的循环在非EDT(事件调度线程)执行,虽然repaint()是线程安全的,但如果后续有UI更新操作,建议用SwingUtilities.invokeLater确保在EDT执行,避免线程安全问题:
public void run(){ while(true){ try { Board.Type mat[][] = (Board.Type[][]) this.objectInputStream.readObject(); final Board.Type[][] finalMat = mat; SwingUtilities.invokeLater(() -> { updateBoard(finalMat); this.repaint(); }); } catch (IOException ex) {} catch (ClassNotFoundException ex) {} } }
调整后,repaint()就能正常触发paintComponent(),控制台会输出"hello"。
内容的提问来源于stack exchange,提问作者Rotem Hanoch
相关产品推荐
相关产品推荐

