1

我有一个 JPanel 包含一堆小图标,还有一个 JLabel 包含一个更大的图标。

首先,我需要澄清一些事情。通过不设置panel.isOpaque,上述panel将有一个透明的背景,并会正确地重叠我的 JPanel 和 JLabel 的图标。这是真的?

现在到我的问题。我一直在关注 Oracle 网站上的 LayeredPanes 教程,但我似乎无法正确处理我的情况。

    JFrame window = new JFrame();
    ImageIcon underIcon;
    URL urlUnder = myClass.class.getResource("images/underImage.gif");
    underIcon = new ImageIcon(urlUnder);
    JLabel labelUnder = new JLabel(underIcon);

    ImageIcon panelIcon;
    URL urlAbove = myClass.class.getResource("images/aboveImage.gif");
    panelIcon = new ImageIcon(urlAbove);
    JLabel aboveIcon1 = new JLabel(panelIcon);
    JLabel aboveIcon2 = new JLabel(panelIcon);

    JPanel panelAbove = new JPanel(new BorderLayout());
    panelAbove.setOpaque(false);
    panelAbove.add(aboveIcon1, BorderLayout.WEST);
    panelAbove.add(aboveIcon2, BorderLayout.EAST);

    JLayeredPane layeredPane = new JLayeredPane();

    layeredPane.setLayout(new BorderLayout());

    layeredPane.add(labelUnder, BorderLayout.CENTER, 1);
    layeredPane.add(panelAbove, BorderLayout.CENTER, 2);

    layeredPane.setOpaque(true);

    window.setContentPane(layeredPane);

    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    window.pack();
    window.setVisible(true);

我只看到面板的内容。而且我 100% 确定图像在那里getResource,所以这不是问题。请就如何正确使用分层窗格提出建议。

4

2 回答 2

3

问题是您正在将布局管理器设置为JLayeredPane

layeredPane.setLayout(new BorderLayout());

就其本身而言,这不是问题,但您选择的布局管理器是。

BorderLayout将只有一个组件占据它的 5 个预定义位置中的任何一个。这意味着当您添加第二个组件时,它会有效地替换第一个组件。

尝试使用类似的人GridBagLayout。提供一个GridBagConstaint集合,使weightx/y值 ara 等于1,填充属性设置为BOTH,并且它的gridx/y属性设置为0

不同BorderLayoutGridBagLayout将允许您将组件布局到相同的位置

于 2013-08-15T20:37:05.953 回答
1

来自Java 教程

layeredPane.add(dukeLabel, new Integer(2), 0);

此代码使用 add 方法的三参数版本。第三个参数指定 Duke 标签在其深度内的位置,它决定了该组件与同一深度的其他组件的关系。

位置用介于 -1 和 (n - 1) 之间的 int 指定,其中 n 是深度处的组件数。与层数不同,位置数越小,其深度内的组件越高。使用 -1 与使用 n - 1 相同;它表示最底部的位置。使用 0 指定组件应位于其深度内的最高位置。如下图所示,除-1外,位置编号越小表示深度内的位置越高。

所以你的深度顺序是错误的,也是从 0 开始的。

我还在解决常见组件问题部分找到了这个

问题:我的分层窗格中的组件未正确分层。事实上,这些层似乎是相反的——深度越低,组件越高。

如果在将组件添加到分层窗格时使用 int 而不是 Integer,则会发生这种情况。要查看发生了什么,在 LayeredPaneDemo 类中,更改

layeredPane.add(label, new Integer(i));

layeredPane.add(label, i);.
于 2013-08-15T20:30:31.670 回答