我想知道如何在使用Java扩展JPanel的类中将JLabel放置在特定位置的另一个JLabel之上。以前人们一直在寻求帮助,但是我发现的解决方案并不令我满意。我正在使用GridLayout,这是我的一些代码:
//imports
public class Game extends JPanel implements MouseListener {
Icon background = new ImageIcon(getClass().getResource("/background.jpg"));
Icon foreground = new ImageIcon(getClass().getResource("/foreground.jpg"));
JLabel backgr = new JLabel(background);
JLabel foregr = new JLabel(foreground);
JFrame frame = new JFrame("Game");
public Game() {
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new GridBagLayout());
backgr.addMouseListener(this);
frame.setLayout(new FlowLayout());
frame.setPreferredSize(new Dimension(200,200));
frame.pack();
frame.setVisible(true);
frame.addMouseListener(this);
backgr.setLayout(new BorderLayout());
frame.add(backgr);
backgr.add(foreground);
}
}
(在此类中,我还有很多其他方法,例如一些鼠标器,但由于它们与该问题无关,所以在此不包括它们。)
当前代码几乎可以按照我的要求工作,前景图片显示在背景的顶部,就在背景的中间。但我希望将前景图片显示在背景图片上的特定坐标处。我以为如果我想在坐标(50,50)上显示前景,我可以说backgr.add(foreground,50,50),它可以编译,但是在运行程序时返回错误。有什么提示吗?我们将不胜感激。
编辑:我发现通过说backgr.setLayout(null),backgr.add(foregr),然后再说foregr.setLocation(50,50),我们可以做我想要的事情。但是由于不鼓励不使用布局管理器,因此我正在寻找更好的解决方案,以便可以使用backgr Icon上的坐标。
最佳答案
人们以前曾寻求帮助,但是我发现的解决方案令我不满意,因为他们要求我将框架布局设置为null,但是我正在使用GridBagLayout
该框架正在使用GridBagLayout。
您要添加前景JLabel,因此要添加背景JLabel。背景标签可以使用所需的任何布局(包括null)。
前景图片显示在背景的正上方。
那是因为您正在使用BorderLayout并将前景添加到CENTER,这是未指定约束时的默认设置。