Java Swing开发躲避游戏运行仅显示空白屏幕该如何修复
问题修复方案
导致运行后空白的核心原因是你创建的Game面板实例没有添加到JFrame窗口中,Swing不会自动将自定义面板挂载到窗口,除此之外还有多处影响运行的问题,修复步骤如下:
1. 核心空白问题修复
在Game.java的main方法中,创建JFrame后添加一行代码,将面板挂载到窗口:
frame.add(game);
同时建议把frame.setVisible(true)放到所有窗口配置的最后,避免渲染异常。
2. 自定义绘制逻辑修正
Swing中自定义绘制应该重写paintComponent方法而非paint方法,修改Game类的绘制方法签名:
@Override protected void paintComponent(Graphics g) { // 原有绘制逻辑保持不变 }
3. 文本显示问题修复
你当前lose默认值为true,但绘制"You Lose"的坐标是(0,0),Swing绘制文本时y坐标对应文字基线,这个位置会导致文字完全显示在窗口可视区域外,修改为:
// 调整到窗口居中位置 g2d.drawString("You Lose", 180, 250);
同时建议将boolean lose = true;改为boolean lose = false;,避免一进入游戏就显示失败提示。
4. Circle类移动逻辑修复
当前Circle的act方法存在两个问题:
- 直接获取屏幕坐标而非相对于游戏面板的坐标,会导致移动位置偏移
- 用坐标差比值计算移动量会出现除以0的异常,且移动轨迹错误
修改为如下实现:
@Override public void act() { // 获取鼠标位置并转换为相对于游戏面板的坐标 Point mousePos = MouseInfo.getPointerInfo().getLocation(); SwingUtilities.convertPointFromScreen(mousePos, this); double dx = mousePos.x - this.x; double dy = mousePos.y - this.y; double distance = Math.sqrt(dx * dx + dy * dy); // 避免和鼠标位置重合时除以0 if (distance > 0) { this.x += (int) (speed * dx / distance); this.y += (int) (speed * dy / distance); } }
5. 动画循环优化
直接在主线程用while循环+Thread.sleep会阻塞Swing的UI事件线程,建议改用Swing自带的Timer实现动画循环,修改main方法如下:
public static void main(String [] args) { // Swing UI操作必须在事件分发线程执行 SwingUtilities.invokeLater(() -> { Game game = new Game(); JFrame frame = new JFrame(game.appName); frame.add(game); frame.setSize(game.frameW, game.frameH); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); // 启动动画定时器 new Timer(game.frmConst, e -> { if (!game.lose) { // 后续可以在这里补充碰撞检测逻辑 game.repaint(); } }).start(); }); }
完成以上修改后运行即可看到敌人和游戏界面正常显示。
内容的提问来源于stack exchange,提问作者iNoob
相关产品推荐
相关产品推荐

