【问题标题】:Displaying a JLabel on top of another JLabel在另一个 JLabel 之上显示一个 JLabel
【发布时间】:2012-11-20 14:08:18
【问题描述】:

我有以下代码:

try {
        File file_background = new File(
                "C:\\Users\\xxxx\\Desktop\\background.png");
        ImageIcon icon_background = new ImageIcon(
                ImageIO.read(file_background));
        JLabel background = new JLabel(icon_background);
        window.setContentPane(background);

        File file_car = new File(
                "C:\\Users\\xxxxxx\\Desktop\\car.png");
        ImageIcon icon_car = new ImageIcon(ImageIO.read(file_car));

        JLabel car = new JLabel(icon_car);
        car.setVisible(true);

        background.add(car);
        // TODO Get car showing on top of the background label

    } catch (IOException e) {

        e.printStackTrace();
    }

我试图在背景标签的顶部显示汽车标签。但我只得到背景 JLabel 显示。我是 SWING 的新手,所以任何关于我缺少哪些步骤的建议都会很棒。

【问题讨论】:

  • 你试过让顶部的标签不透明吗?
  • 取决于,问题是你想用JLabel car移动吗???,或者这个数字是静态的
  • @mre 很高兴再次在这里见到你
  • 是的,我想把它移到稍后阶段。但现在我希望它首先显示 :)
  • @mre - 试过了。什么都没做

标签: java swing jlabel


【解决方案1】:

..我想把它移到稍后阶段。但是现在我希望它首先显示:)

有两种方式,

第一个。

  • 将JLabel car 放入JPanel,使用paintComponent 绘制Image,而不是JLabel background(优势JPanel 是带有LayoutManager 适当通知的容器)。

  • 将JLabel car 放到JLabel background,但是JLabel 还没有实现任何LayoutManager,必须设置为期望。

    1. 优势JLabel 中的所有图像都是静态的,与paintComponent 相比,CPU 和 GPU 影响广告消耗为零。
    2. 缺点JLabel 不是容器,并且与LayoutManager 的适当通知相比,与JLabel 放在JPanel 中相比,需要一些单独的代码,因为移动(AbsoluteLayout)是一个很好的解决方案。李>

第二次。

使用BufferedImage and Graphics 绘制Images。

【讨论】:

    【解决方案2】:

    将它们都添加到使用OverlayLayout 的JPanel。不能将JLabel 添加到另一个JLabel。

    这段代码没有经过编译器,所以就照原样吧:)

    JPanel panel = new JPanel(new OverlayLayout());
    panel.add(background);
    panel.add(car);
    

    【讨论】:

    • 您能否解释一下为什么不能将一个 JLabel 添加到另一个 JLabel 中?谢谢
    • 查看 JPanel 的文档。它旨在包含其他 JComponent(而 JLabel 是一个 JComponent)。 JLabel 间接继承自 Container,Container 是一个 AWT 组件,旨在包含其他 AWT 组件。这令人困惑,但我猜如果您不使用 JPanel,您会遇到与您刚刚所做的类似的几个问题(布局不起作用)。
    • 哦,好吧。所以你想让我把它们都从 JLabel 更改为 JPanel,然后使用 OverlayLayout 来显示另一个?
    • +1 用于通过 OverLayLayout 布局 JLabel,但这是在 JLabel 中放置 JLabel 的一个很好的理由,
    • 有一个OverlayLayout 例子here。
    【解决方案3】:

    Works.. 添加以下内容使其显示:

    car.setBounds(200, 200, 200, 200);
    

    显然这是因为默认情况下使用空布局管理器。因此,设置标签的边界将使其能够显示,因为默认大小为 0。

    【讨论】:

    • 默认布局管理器永远不是空布局管理器...您必须在某处明确设置,我强烈建议您更改。
    猜你喜欢
    • 2013-03-17
    • 2010-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多