2

我现在正在开发的游戏遇到问题;这段代码的目的是改变窗口中 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),然后重新粉刷,我将不胜感激。

4

1 回答 1

2

我将其更改为答案:

你的方法不应该setLocation(...)覆盖调用它的超级方法吗?如果没有,它就不会做它需要做的事情。而且我不确定它应该调用repaint(). 另外,保存 JComponent 的容器使用什么布局?有几种方法可以使容器中的组件居中,包括使用 GridBagLayout 和添加没有 GridBagConstraints 的组件,这是默认方式。最后,考虑创建并发布一个sscce以更好地展示您的问题。

于 2012-08-06T02:32:07.957 回答