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

Java使用Canvas的BufferStrategy绘图无法显示问题求助

问题修复方案

你代码里的核心问题有3处,按优先级修改即可:

  1. 清屏与背景色设置顺序颠倒
    clearRect()会使用当前Graphics上下文的背景色清空画布,你先执行清屏再设置黑色背景,黑色根本不会生效。
  2. 未禁用Canvas的默认重绘逻辑
    AWT/Swing默认会自动重绘组件,会覆盖你通过BufferStrategy绘制的内容,必须主动关闭。
  3. 窗口布局未完成就显示
    你添加Canvas到窗口后没有执行pack(),组件尺寸未正确初始化,第一次绘制时宽高可能为0。

修改后的createDisplay()代码

public static void createDisplay() {
    if (frame != null)
        return;

    URL path = Display.class.getResource(ICON_PATH);
    Image icon = Toolkit.getDefaultToolkit().getImage(path);
    GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment();
    GraphicsConfiguration config = env.getDefaultScreenDevice().getDefaultConfiguration();

    Display.frame = new JFrame(FRAME_TITLE); // 统一用Swing的JFrame避免混用冲突
    Display.canvas = new Canvas(config);
    frame.setMinimumSize(MIMIMUM_FRAME_SIZE);
    
    canvas.setIgnoreRepaint(true); // 禁用默认重绘
    frame.setIconImage(icon);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 不需要可以保留原有WindowListener逻辑
    frame.add(canvas);
    frame.pack(); // 先完成布局再设置窗口状态
    frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
    frame.setVisible(true);
}

修改后的drawFrame()代码

public void drawFrame() {
    Canvas canvas = Display.getCanvas();
    BufferStrategy strat = canvas.getBufferStrategy();
    if (strat == null) {
        canvas.createBufferStrategy(3);
        return;
    }
    
    do {
        do {
            Graphics2D g = null;
            int screenWidth = canvas.getWidth();
            int screenHeight = canvas.getHeight();
            
            try {
                g = (Graphics2D) strat.getDrawGraphics();
                // 先设置背景色再清屏
                g.setBackground(Color.BLACK);
                g.clearRect(0, 0, screenWidth, screenHeight);
                // 后续绘制逻辑写在这里
            } finally {
                if (g != null) {
                    g.dispose();
                }
            }
        } while (strat.contentsRestored());
        
        strat.show();
        Toolkit.getDefaultToolkit().sync(); // 强制刷新系统显示缓存,部分设备需要加这行才能立刻生效
    } while (strat.contentsLost());
    
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 19:24:00