1

我有一个 JLayeredPane。我的程序是这样工作的:

JPanel p1 = new JPanel(new BoxLayout(p1, BoxLayout.X_AXIS));
JPanel p2 = new JPanel(new BoxLayout(p2, BoxLayout.Y_AXIS));
JLayeredPane lp = new JLayeredPane();
lp.add(p1, 1);
lp.add(p2, 0);

p1 和 p2 都有按钮等组件...

问题是当我将两个 JPanel 添加到 JLayeredPane 时,没有出现。

我尝试更改 JLayeredPane() 的布局。

例如,我做了:

lp.setLayout(new BoxLayout(lp, BoxLayout.X_AXIS));

然后,JPanels 会显示,但它们显示为相邻,不考虑 JLayeredPane 的层。

我是否被迫使用空布局?

如何让我的 JLayeredPane 尊重图层并正确显示我的两个 BoxLayout JPanel?

当我给我的 JLayeredPane 一个布局时,它会显示面板,但它根本不尊重图层。

4

3 回答 3

5

您需要一个了解 Z 轴的布局管理器。默认布局管理器不理解 JLayeredPane 的 Z 轴。

如果您只是想将东西叠加在一起,您可以使用这样的 LayoutManager:

JLayeredPane layeredFooPane = new JLayeredPane();
// The magic!
layeredFooPane.setLayout(new LayeredPaneLayout(layeredPane));
// Add components:
layeredFooPane.add(fooComponent, new Integer(JLayeredPane.DEFAULT_LAYER + 10));
layeredFooPane.add(barComponent, JLayeredPane.DEFAULT_LAYER);

布局管理器类:

public class LayeredPaneLayout implements LayoutManager {

    private final Container target;
    private static final Dimension preferredSize = new Dimension(500, 500);

    public LayeredPaneLayout(final Container target) {
            this.target = target;
    }

    @Override
    public void addLayoutComponent(final String name, final Component comp) {
    }

    @Override
    public void layoutContainer(final Container container) {
            for (final Component component : container.getComponents()) {
                    component.setBounds(new Rectangle(0, 0, target.getWidth(), target.getHeight()));
            }
    }

    @Override
    public Dimension minimumLayoutSize(final Container parent) {
            return preferredLayoutSize(parent);
    }

    @Override
    public Dimension preferredLayoutSize(final Container parent) {
            return preferredSize;
    }

    @Override
    public void removeLayoutComponent(final Component comp) {
    }
}
于 2013-04-15T22:57:26.190 回答
3

JLayeredPane 的行为就像它使用空布局一样。在将 JPanel 添加到 JLayeredPane 时,您必须指定 JPanel 的大小和位置。我会推荐这个的少数几次之一:

JPanel p1 = new JPanel(new BoxLayout(p1, BoxLayout.X_AXIS));
JPanel p2 = new JPanel(new BoxLayout(p2, BoxLayout.Y_AXIS));
JLayeredPane lp = new JLayeredPane();
lp.add(p1, 1);
lp.add(p2, 0);

p1.setSize(lp.getPreferredSize());
p2.setSize(lp.getPreferredSize());
于 2013-04-15T23:03:20.690 回答
1

我遇到了类似的问题。添加窗格时不要传递图层,而是尝试单独进行:

lp.setLayer(p1, 1);
lp.setLayer(p2, 0);
lp.add(p1);
lp.add(p2);

必须在添加组件之前定义层。您也可以尝试使用 JLayeredPane.DEFAULT_LAYER 而不是 0。

就我而言,我的 JLayeredPane 有 GridBagLayout,我不知道它是否适用于默认布局。

于 2018-03-07T00:00:27.823 回答