JLayeredPane不尊重层



我有一个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));

然后,jpanel确实显示,但它们是相邻显示的,不尊重JLayeredPane的层。

我是否必须使用空布局?

我怎样才能使我的JLayeredPane尊重层,并显示我的两个BoxLayout jpanel正确?

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

你需要一个能够理解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);

LayoutManager类:

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) {
    }
}

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());

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

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

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

在我的情况下,我的JLayeredPane有GridBagLayout,我不知道它是否与默认布局工作

最新更新