我现在正在开发的游戏遇到问题;这段代码的目的是改变窗口中 JComponent 的位置。这就是我希望它发挥作用的方式:
1:程序启动,创建640x640像素的JFrame;JComponent 在直接中心绘制。
2:当按下“ESC”时,JFrame会炸到全屏;JComponent 在直接中心绘制。
3:当JFrame在全屏时按下“ESC”,它会恢复到原来的大小。
我遇到的问题是 JComponent 没有被重新绘制到全屏的中心,尽管我努力更新变量。我决定尝试通过执行三个 System.out.println 测试来调试它:第一个测试“A”在 setLocation 方法中打印参数“loc”的值。第二个,“B”,打印点“位置”的值,将其值从原始值更改为参数给定的值。
第三个测试“C”在 setLocation 中通过 repaint 调用 paintComponent 方法时精确给出,它打印 location 的值,如测试“B”。这就是事情搞砸的地方。
首次绘制 JFrame 时会给出第一组测试;JComponent 的位置在每个测试中都是相同的。第二组测试是在调整 JFrame 大小时给出的;JComponent 的位置应在 setLocation 方法中更新,如“A”和“B”所示。但是,当我在测试“C”中调用位置时,该位置将恢复为 JFrame 的原始位置。
public void setLocation(Point loc)
{
location = new Point(loc.x, loc.y);
System.out.println(loc + "A"); System.out.println(location + "B");
repaint();
}
public void paintComponent(Graphics g)
{
System.out.println(location + "C");
Graphics2D g2 = (Graphics2D)(g);
BufferedImage x = null;
if(isMale)x = mobs[0]; else x = mobs[1];
g2.drawImage(rotate(x, direction), null, (int)location.getX(), (int)location.getY());
}
private Point location = new Point(280, 280);
输出:
java.awt.Point[x=280,y=280]A
java.awt.Point[x=280,y=280]B
java.awt.Point[x=280,y=280]C
java.awt.Point[x=1880,y=1040]A
java.awt.Point[x=1880,y=1040]B
java.awt.Point[x=280,y=280]C
java.awt.Point[x=280,y=280]A
java.awt.Point[x=280,y=280]B
java.awt.Point[x=280,y=280]C
如果有人能帮我弄清楚为什么点“位置”在更新后不停留在 (1880, 1040),然后重新粉刷,我将不胜感激。