Java Swing设置Canvas颜色却显示错误灰度色问题求助
问题原因及解决办法
核心问题
你的代码存在一个关键错误:每次调用canvas.getGraphics()都会生成一个全新的Graphics实例:
- 第一行
canvas.getGraphics().setColor(Color.BLUE):给第一个临时Graphics对象设置了蓝色,但这个对象用完就被丢弃 - 第二行
canvas.getGraphics().getColor():拿到的是全新的Graphics对象,它的默认颜色就是灰色(也就是你打印的sun.swing.PrintColorUIResource[r=51,g=51,b=51]) - 第三行
canvas.getGraphics().fillRect(...):又是一个未设置颜色的新Graphics对象,自然用默认灰色填充
修复方案
方案1:复用同一个Graphics对象
提前获取一次Graphics对象并复用,避免每次调用getGraphics()生成新实例:
if (jFrame == null) { jFrame = new JFrame(); canvas = new Canvas(); jFrame.add(canvas); canvas.setSize(280, 280); jFrame.setSize(280, 280); jFrame.setVisible(true); } // 只获取一次绘图上下文 Graphics g = canvas.getGraphics(); g.setColor(Color.BLUE); System.out.println(g.getColor()); // 此时会正确打印蓝色 for (int x = 0; x < 28; x++) { for (int y = 0; y < 28; y++) { g.fillRect(x * 10, y * 10, 10, 10); } } // 使用完毕后释放资源 g.dispose();
方案2:重写Canvas的paint方法(推荐)
AWT/Swing组件的标准绘图方式是重写paint方法,这样窗口触发重绘(比如最小化后恢复、拖动窗口)时,绘制内容不会丢失:
JFrame jFrame; Canvas canvas; public void initCanvas() { if (jFrame == null) { jFrame = new JFrame(); canvas = new Canvas() { @Override public void paint(Graphics g) { super.paint(g); // 先清空画布原有内容 g.setColor(Color.BLUE); for (int x = 0; x < 28; x++) { for (int y = 0; y < 28; y++) { g.fillRect(x * 10, y * 10, 10, 10); } } } }; jFrame.add(canvas); canvas.setSize(280, 280); jFrame.setSize(280, 280); jFrame.setVisible(true); } // 手动触发重绘 canvas.repaint(); }
额外提示
- 不要频繁调用
getGraphics(),这个方法获取的是临时绘图上下文,稳定性差且容易造成资源浪费 - 重写
paint方法是AWT/Swing组件绘图的规范写法,能保证组件在各种场景下的显示一致性
内容的提问来源于stack exchange,提问作者Jan
相关产品推荐
相关产品推荐

