You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 06:48:23