我想知道如何在使用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,这是未指定约束时的默认设置。

10-05 20:57
查看更多