Java使用Canvas的BufferStrategy绘图无法显示问题求助
问题修复方案
你代码里的核心问题有3处,按优先级修改即可:
- 清屏与背景色设置顺序颠倒
clearRect()会使用当前Graphics上下文的背景色清空画布,你先执行清屏再设置黑色背景,黑色根本不会生效。 - 未禁用Canvas的默认重绘逻辑
AWT/Swing默认会自动重绘组件,会覆盖你通过BufferStrategy绘制的内容,必须主动关闭。 - 窗口布局未完成就显示
你添加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
相关产品推荐
相关产品推荐

