簡體   English   中英

JLayeredPane不尊重圖層

[英]JLayeredPane not respecting layers

我有一個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都具有按鈕等組件。

問題是,當我將兩個JPanels添加到JLayeredPane時,將顯示NOTHING。

我嘗試更改JLayeredPane()的布局。

例如,我做了:

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

然后,JPanel確實顯示了,但是它們顯示為相鄰的,沒有考慮到JLayeredPane的層。

我是否被迫使用空布局?

如何使我的JLayeredPane尊重圖層並正確顯示我的兩個BoxLayout JPanels?

當我為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 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,我不知道它是否適用於默認布局。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM