我想知道如何将JLabel放在另一个JLabel的顶部,在一个特定的位置,在一个用Java扩展JPanel的类中。人们之前曾要求帮助,但我发现的解决方案并不能让我满意。我正在使用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(前景,50,50),这会编译,但在运行程序时会返回错误。什么做的提示?真的很感激。
编辑:我发现通过说出backgr.setLayout(null),backgr.add(foregr)和foregr.setLocation(50,50),我们可以做我想要的。但由于不鼓励不使用布局管理器,我正在寻找更好的解决方案,以便我可以使用高建群图标上的坐标。
答案 0 :(得分:4)
之前人们已经请求过这方面的帮助,但我找到的解决方案并不满足于我,因为他们要求我将框架布局设置为null,但我使用的是GridBagLayout
框架正在使用GridBagLayout。
您正在添加前景JLabel,因此背景为JLabel。背景标签可以使用您希望的任何布局(包括null)。
前景图片显示在背景的顶部,就在它的中间。
这是因为您正在使用BorderLayout并将前景添加到CENTER,这是您未指定约束时的默认值。