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

为何无法在屏幕绘制图形?Java Swing代码排查请求

排查Java Swing绘制正方形失败的问题

你的代码无法正常绘制图形,核心问题出在BufferStrategy的归属和组件初始化顺序上,以下是具体问题分析和修正方案:

问题点分析

  • BufferStrategy绑定错误:你给JFrame创建了缓冲策略,但实际用于绘制的是独立的Canvas组件,绘制上下文必须和Canvas绑定,而非JFrame。
  • 初始化顺序颠倒:先创建JFrame的BufferStrategy,再将Canvas添加到窗口,此时Canvas未完成布局初始化,无法获取有效的绘制上下文。
  • 缺少画布清空步骤:每次循环绘制时未清空画布,即使后续绘制成功,也可能被之前的残留内容覆盖或显示异常。
  • 无帧率控制:无限循环未添加休眠,导致CPU占用过高,绘制节奏混乱。

修正后的代码

import javax.swing.JFrame;
import java.awt.*;
import java.awt.image.*;

class Screen extends Canvas {

    public static JFrame window(int width, int height, String title) {
        JFrame window = new JFrame(title);
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        window.setResizable(false);
        return window;
    }

    public static Canvas canvas(int width, int height) {
        Canvas canvas = new Canvas();
        canvas.setPreferredSize(new Dimension(width, height));
        canvas.setFocusable(true);
        return canvas;
    }

    public static Graphics createGraphics(BufferStrategy strategy) {
        return strategy.getDrawGraphics();
    }

    public static BufferStrategy createStrategy(Canvas canvas) {
        // 等待Canvas完成初始化,避免创建缓冲策略失败
        while (true) {
            try {
                canvas.createBufferStrategy(2);
                break;
            } catch (IllegalStateException ignored) {}
        }
        return canvas.getBufferStrategy();
    }

    public static void main(String[] args) {
        JFrame window = window(800, 600, "Application");
        Canvas canvas = canvas(800, 600);
        
        // 先添加组件、调整布局,再显示窗口
        window.add(canvas);
        window.pack();
        window.setVisible(true);
        
        // 给Canvas创建专属的BufferStrategy
        BufferStrategy strategy = createStrategy(canvas);

        while (true) {
            Graphics g = createGraphics(strategy);
            
            // 清空画布(白色背景)
            g.setColor(Color.WHITE);
            g.fillRect(0, 0, canvas.getWidth(), canvas.getHeight());
            
            // 绘制黑色正方形
            g.setColor(Color.BLACK);
            g.fillRect(0, 0, 20, 20);
            
            g.dispose();
            strategy.show();
            
            // 控制帧率,约60帧/秒
            try {
                Thread.sleep(16);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

关键修正说明

  1. BufferStrategy绑定Canvas:将缓冲策略的创建对象改为Canvas,确保绘制上下文与目标组件匹配。
  2. 调整初始化流程:先将Canvas添加到JFrame,调用pack()让窗口根据Canvas的首选大小自动调整,再显示窗口,最后创建缓冲策略,保证组件初始化完成。
  3. 添加画布清空:每次绘制前用背景色填充整个画布,避免图形残留。
  4. 添加帧率控制:通过Thread.sleep(16)控制绘制节奏,降低CPU占用,让绘制更稳定。

内容的提问来源于stack exchange,提问作者Bilal Akol

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 14:35:26