【发布时间】:2011-02-21 22:25:48
【问题描述】:
基本上,我试图做的是将 JPanel 添加到另一个 JPanel 上,该 JPanel 使用 paintComponent() 方法在其上绘制了图形。但是我尝试添加的 JPanel 没有显示,因为它被带有图形的 JPanel 覆盖了。
我怎样才能做到这一点,当我将 JPanel 添加到带有图形的那个时,它会在前面显示 JPanel 而不是被图形覆盖?
感谢所有答案! :)
如果您需要代码,请告诉我,我很乐意将它放在这里。
好的,代码如下:
package javavideogame;
public class Game extends JPanel implements ActionListener, Runnable
{
public Game(MainCharacter character)
{
setLayout(null);
setFocusable(true);
}
public void paintComponent(Graphics g)
{
super.paintComponent(g);
g.drawImage(ground, 0, 0, this);
g.drawImage(character.getImage(), character.getX(), character.getY(), this);
g.setColor(Color.RED);
g.drawRect(10, 10, character.getMaxHealth(), 10);
g.fillRect(10, 10, character.getHealth(), 10);
g.dispose();
}
public void getInventoryScreen()
{
Main.inv = new Inventory();
Main.game.add(Main.inv);
}
}
这是我添加到 Game JPanel 中的 JPanel 的代码
public class Inventory extends JPanel
{
public Inventory()
{
setLayout(null);
setSize(400, 300);
setBackground(Color.BLACK);
addKeyListener(this);
setFocusable(true);
}
}
【问题讨论】:
-
应始终发布 SSCCE,这样我们就不必猜测您可能会或可能不会做什么。此外,很多时候在创建 SSCCE 时,您会发现问题,因此您甚至不需要发布问题。
-
我认为您不应该处理传递给您的 paintComponent 方法的 Graphics 对象。我不确定这会产生什么影响,但看起来不太好。 OTOH,是的,请在使用完之后释放您自己创建的 Graphics 对象,但不是因为您没有创建它而传递给 paint 或 paintComponent 的那个。
-
@Hovercraft 你的方法奏效了!我拿出了 g.dispose();它完全有效!我只是把它放在那里,因为我有点按照教程所说的去做。不过谢谢!
-
作为旁注,调用
getAnything(...)并使用void并实际设置一些东西是一个糟糕的命名决定。我建议将其称为initInventoryScreen(),作为一种良好做法。 -
是的,如果您从 BufferedImage 创建 Graphics 对象,本教程是正确的。否则,您可能会耗尽系统资源。但是传入您的paintComponent 方法的Graphics 对象是由Graphics 子系统(我认为)创建的,并且可以用于绘制组件的边框和子项。由于您添加的 JPanel 是一个子组件,因此如果您处置 Graphics 对象,它可能不会被绘制。对于那里的任何专家——请纠正我在这里可能做出的任何不正确的假设——谢谢!
标签: java swing graphics jpanel