【问题标题】:Putting a JLabel on top of a JLabel in Java在 Java 中将 JLabel 放在 JLabel 之上
【发布时间】:2013-12-23 09:25:51
【问题描述】:

我想知道如何将 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(foreground, 50,50),这样可以编译,但在运行程序时会返回错误。有什么建议吗?将不胜感激。

编辑:我发现通过说 backgr.setLayout(null)、backgr.add(foregr) 和 foregr.setLocation(50,50),我们可以做我想要的。但由于不鼓励不使用布局管理器,我正在寻找更好的解决方案,以便我可以使用 backgr Icon 上的坐标。

【问题讨论】:

  • 返回什么错误?
  • @Prasad "线程 "AWT-EventQueue-0" java.lang.IllegalArgumentException 中的异常:组件位置非法。"无论我选择哪个坐标,我都认为这是错误的方法
  • 读取API,此方法不用于指定X/Y坐标。
  • @camickr 你是对的。那用什么方法呢?
  • “将 JLabel 放在 JLabel 之上” 我在另一个答案中忘了提及,有时直接进行自定义绘画更简单,甚至如果渲染组件。例如。在这种情况下,您可以将两个标签渲染为单独的图像,然后知道它们的宽度和高度,然后将两者渲染到“画布”以向用户显示。画布可能是自定义绘制的JPanel(就像我使用渐变绘制一样),也可能是另一个图像,显示在JLabel 中。对于任何不可调整大小的东西,我更喜欢第二种方法。比较简单,不需要...

标签: java swing layout jframe jlabel


【解决方案1】:

人们之前曾就此寻求帮助,但我发现的解决方案并不令我满意,因为他们要求我将框架布局设置为 null,但我使用的是 GridBagLayout

框架正在使用 GridBagLayout。

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

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

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

【讨论】:

  • 所以我先说backgr.setLayout(null)?那么如果我想在坐标(50,50)上显示前景图片,我之后是不是说backgr.add(foreground,50,50)?我刚刚尝试了这个,我仍然得到一个错误,我做错了什么吗?
  • @Sid,我以为你说你找到了向你展示如何使用空布局的帖子?
  • 是的,我说过,我意识到我不清楚。这些帖子显示了如何在另一个 JLabel 之上显示一个 JLabel,但没有显示如何在特定坐标上显示。我可以改写我的帖子。但是你知道怎么做吗?
  • 强烈建议不要使用“空布局”,但如果您真的想知道如何使用,请阅读 Absolute Positioning 上的 Swing 教程中的部分以获取更多信息和工作示例。跨度>
  • 如果气馁,那我宁愿另寻出路。因此,如果您知道使用布局管理器解决问题的另一种更好的方法,请告诉我!顺便说一句,谢谢你的帮助。
猜你喜欢
  • 1970-01-01
  • 2017-02-16
  • 2010-12-03
  • 1970-01-01
  • 2013-03-17
  • 2013-05-03
  • 1970-01-01
  • 2018-01-23
  • 1970-01-01
相关资源
最近更新 更多