gpt4 book ai didi

java - 如何在 Java 中将 JFrame 图像显示到窗口前面?

转载 作者:行者123 更新时间:2023-12-02 11:18:52 25 4
gpt4 key购买 nike

所以我目前遇到的问题是,当我尝试在 Java 中以图形方式显示它们时,大图像会覆盖程序中的较小图像。我想知道如何将某些图像带到窗口的前面,以便大的“背景”图像保留在背景中。另外,我不认为我的程序有可能简单地以相反的顺序实现图片。

这是我使用的代码:我的图像管理器类以及我用来将图像实现到窗口中的方法,

import java.awt.*;
import javax.swing.*;

public class ImageManager extends JFrame {

private ImageIcon image1;
private JLabel label1;

private ImageIcon image2;
private JLabel label2;

private ImageIcon image3;
private JLabel label3;

public ImageManager() {

}

public void addBackground() {
image3 = new ImageIcon(getClass().getResource("background.png"));
label3 = new JLabel(image3);
add(label3);
}

public void addSeaweed() {

image1 = new ImageIcon(getClass().getResource("seaweed.png"));
label1 = new JLabel(image1);
add(label1);

}

public void addUnderwatervolcano() {
image2 = new ImageIcon(getClass().getResource("underwatervolcano.png"));
label2 = new JLabel(image2);
add(label2);
}

}

这是我使用 ImageManager 中的方法的地方: 使用grow()方法显示海藻图片的方法,

public Seaweed() {

setLayout(new FlowLayout());
World.gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
World.gui.setVisible(true);
World.gui.pack();
World.gui.setTitle("seaweed and underwatervolcano");
carbon = 0;
}


public void grow() {

if(World.getOceanCarbon() >= 10) {
addCarbon(10);
World.addOceanCarbon(-10);



World.gui.addSeaweed();
World.gui.pack();
}
}

下面是另一个类中的方法,该方法使用 Seaweed 类中的 Growth() 方法和 ImageManager 类中的 gui.addBackground() 方法,

public static void runWorld() {

gui.addBackground();

UnderwaterVolcano volcano = new UnderwaterVolcano();
Seaweed seaweed = new Seaweed();

volcano.erupt();
seaweed.grow();



gui.setMinimumSize(new Dimension(905, 560));

}
}

我想知道如何做到这一点,以便 gui.addBackground() 不会掩盖来自 gui.addSeaweed() (在 seaweed.grow() 方法中调用)的海藻图片,同时仍然调用 gui。在调用 gui.addSeaweed() 之前使用 addBackground()。无论如何,我可以在方法调用中操纵图像在窗口中显示的顺序吗?我对 JFrame 没有很好的理解,所以请对您的答案进行详细解释,感谢所有帮助。

最佳答案

好吧,您当前的逻辑将所有图像添加到框架中。 Swing 实际上绘制了最先添加的最后一个组件。也就是说,组件是根据首先绘制的最高 ZOrder 进行绘制的。组件的默认 ZOrder 只是将组件添加到面板时的组件计数。所以是的,根据您当前的逻辑,背景将绘制在其他图像之上。

几个简单的解决方案:

1) 管理组件的 ZOrder。

将组件添加到框架后,您可以重置 ZOrder,以便最后绘制组件。所以基本代码是

add(aComponent);
setComponentZOrder(aComponent, 0);

2) 将子图像添加到背景图像,而不是将所有图像添加到框架。所以你有一个像这样的结构:

- frame
- background image
- seaweed
- volcano

所以基本逻辑是这样的:

frame.add( background );
background.add( seaweed );
background.add( volcano );

由于看起来海藻/火山图像位于背景上的随机位置,因此您仍然需要管理每个图像的大小/位置。

请注意,将子组件添加到背景时,子组件必须完全包含在背景图像中,否则子图像将被截断。

这是我将使用的方法,因为它更好地描述了应用程序的结构。也就是说,您的框架包含一个背景,并且该背景包含其他子组件。为了获得所需的框架布局,组件的嵌套很常见。

关于java - 如何在 Java 中将 JFrame 图像显示到窗口前面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50077383/

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