首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JLayeredPane不尊重层

JLayeredPane不尊重层
EN

Stack Overflow用户
提问于 2013-04-16 06:43:02
回答 3查看 2.1K关注 0票数 1

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

代码语言:javascript
复制
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都有像按钮这样的组件。

问题是,当我将两个JPanels都添加到JLayeredPane中时,什么也没有出现。

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

例如,我这样做了:

代码语言:javascript
复制
lp.setLayout(new BoxLayout(lp, BoxLayout.X_AXIS));

然后,JPanels确实会显示,但它们是相邻显示的,与JLayeredPane的层无关。

我是否被强制使用空布局?

如何让我的JLayeredPane尊重这些层并正确显示我的两个BoxLayout JPanels?

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-04-16 06:57:26

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

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

代码语言:javascript
复制
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类:

代码语言:javascript
复制
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) {
    }
}
票数 5
EN

Stack Overflow用户

发布于 2013-04-16 07:03:21

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

代码语言:javascript
复制
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());
票数 3
EN

Stack Overflow用户

发布于 2018-03-07 08:00:28

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

代码语言:javascript
复制
lp.setLayer(p1, 1);
lp.setLayer(p2, 0);
lp.add(p1);
lp.add(p2);

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

在我的例子中,我的JLayeredPane有GridBagLayout,我不知道它是否可以使用默认布局。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16025874

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档