将JLabel放在Java中的JLabel之上

时间:2013-12-06 05:48:37

标签: java swing layout jframe jlabel

我想知道如何将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),我们可以做我想要的。但由于不鼓励不使用布局管理器,我正在寻找更好的解决方案,以便我可以使用高建群图标上的坐标。

1 个答案:

答案 0 :(得分:4)

  

之前人们已经请求过这方面的帮助,但我找到的解决方案并不满足于我,因为他们要求我将框架布局设置为null,但我使用的是GridBagLayout

框架正在使用GridBagLayout。

您正在添加前景JLabel,因此背景为JLabel。背景标签可以使用您希望的任何布局(包括null)。

  

前景图片显示在背景的顶部,就在它的中间。

这是因为您正在使用BorderLayout并将前景添加到CENTER,这是您未指定约束时的默认值。