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

窗口缩放后Pacman定位偏移及移动异常问题求助(Java Swing)

问题排查与修复方案

窗口缩放后Pacman定位偏移

大概率是你直接存储了Pacman的绝对像素坐标,窗口缩放后单元格尺寸发生变化,但坐标未同步重新计算,导致相对位置偏移。

试试这么改:

  • 不要存储绝对像素值,改为记录Pacman当前所在的单元格行列,加上它在单元格内的位置比例(比如x方向占单元格宽度的百分比,y方向同理)。
  • 给窗口添加ComponentListener监听,在窗口 resize 完成后,通过table.getCellRect(row, col, true)获取当前单元格的实际像素区域,再结合比例重新计算Pacman的绝对坐标:
    Rectangle cellRect = yourTable.getCellRect(currentRow, currentCol, true);
    int newX = cellRect.x + (int)(cellRect.width * xRatio); // xRatio为0-1的浮点数,0.5即单元格中间位置
    int newY = cellRect.y + (int)(cellRect.height * yRatio);
    pacman.setLocation(newX, newY);
    

这样无论窗口如何缩放,Pacman都会跟随单元格位置同步调整,相对窗口的位置就能保持稳定。

Pacman仅在单元格尺寸较大时才能移动

估计是移动步长写死为固定值,小单元格下步长超过单元格边界,或是碰撞检测逻辑在小尺寸场景下出现误判。

修复思路:

  • 将移动步长改为基于单元格尺寸的比例值,比如每次移动单元格宽度的1/20,这样无论单元格大小,移动速度相对一致,也不会出现一步跨出单元格的情况:
    int cellWidth = yourTable.getColumnModel().getColumn(0).getWidth();
    int moveStep = cellWidth / 20;
    // 根据方向对Pacman的坐标进行加减操作
    
  • 检查碰撞检测逻辑,不要用固定像素值判断边界,而是通过当前单元格的cellRect来判断Pacman是否处于可移动范围,或是是否需要切换到相邻单元格。
  • 确保动画线程的刷新频率稳定,小单元格下若刷新不及时,容易出现移动无响应的情况。

额外提醒

尽量用「单元格行列+相对位置」的方式管理Pacman状态,避免直接操作绝对像素,后续调整单元格数量或窗口缩放时,适配成本会低很多。测试时可以打印日志,输出窗口resize前后的单元格尺寸、Pacman坐标,方便定位计算错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 20:33:25