gpt4 book ai didi

java - 背景与我其他 JLabels 的视野重叠

转载 作者:行者123 更新时间:2023-12-02 09:46:04 25 4
gpt4 key购买 nike

我正在使用 JFrame 和 JLabels 创建一个非常简单的游戏,我设法使其工作,但在放置背景时我发现了一个问题。我设置为背景的图像覆盖了我的其他 JLabel(它们仍然在后面工作,但您看不到它们)。

public class Game extends JPanel {

Player p1 = new Player(this, 'a');
Player p2 = new Player(this, 'r');

public Game() {}

public void move() {}
public void gameOver() {}

@Override
public void paint(Graphics g) {
super.paint(g);
Graphics2D g2d = (Graphics2D) g;
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
p1.paint(g2d);
p2.paint(g2d);
}

public static void main(String[] args) throws InterruptedException, IOException {

BufferedImage img = ImageIO.read(new File(not relevant));
JFrame frame = new JFrame("Window");
JLabel background = new JLabel(new ImageIcon(img));
Game game = new Game();


frame.add(game);
frame.add(background);


frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.setVisible(true);

while (true) {
game.move();
game.repaint();
Thread.sleep(10);
}
}

}

我认为问题来自于使用我的游戏类(这是“运行”游戏的类)作为 JPanel,然后在 Main 中创建一个 JFrame 并添加它......如果没有办法解决这个问题,我会改变它,但想保持现在的样子。我尝试过交换:

frame.add(游戏);框架.add(背景);

但结果是:

游戏-->背景-->只能看到背景,但仍然可以玩游戏

背景-->游戏-->你只能看到一个迷你窗口(没有大小,只有最小化、最大化和关闭),但仍然可以玩游戏。

还尝试在 Game 类中创建背景图像,但不起作用。

最佳答案

JFrame 的内容 Pane 默认使用 BorderLayout,这意味着 add(game) 会将 Game 组件放置在 BorderLayout 的中心。 BorderLayout 一次只能有一个中心组件,因此 add(background) 用背景 JLabel 替换旧的中心组件(游戏)。

一个简单的解决方案是避免使用 JLabel 作为背景,而只需在您的绘制方法中绘制背景:

g2d.drawImage(img, 0, 0, this);
p1.paint(g2d);
p2.paint(g2d);

这将需要您的 Game 类中存在 BufferedImage(或仅 Image)类型的私有(private)字段,您可以在该类的构造函数中设置该字段。

请注意,您几乎应该始终覆盖 paintComponent而不是油漆:

@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
// ...
}

有关 Swing 组件绘制的所有详细信息,请参阅 https://www.oracle.com/technetwork/java/painting-140037.html .

更新:当调用 JFrame 的 pack() 方法时,您的 background JLabel 似乎正在定义 JFrame 内容的大小.

一旦您的背景 JLabel 被删除,唯一剩下的组件(Game 类的实例)必须定义其自己的首选大小,以便当 JFrame 的 pack() 方法被调用,它将知道 JFrame 的内容希望的大小。您可以通过让 Game 类明确报告其首选大小来做到这一点:

@Override
public Dimension getPreferredSize() {
return new Dimension(img.getWidth(), img.getHeight());
}

这将要求 img 为 BufferedImage 类型,因为 Image 类中不存在零参数 getWidth 和 getHeight 方法。

关于java - 背景与我其他 JLabels 的视野重叠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56653002/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com