Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JLayeredPane不考虑图层_Java_Swing_Layout Manager_Jlayeredpane_Null Layout Manager - Fatal编程技术网

Java JLayeredPane不考虑图层

Java JLayeredPane不考虑图层,java,swing,layout-manager,jlayeredpane,null-layout-manager,Java,Swing,Layout Manager,Jlayeredpane,Null Layout Manager,我有一张红色的窗格。我的程序是这样工作的: 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); JLayeredPane layeredFooPane = new JLa

我有一张红色的窗格。我的程序是这样工作的:

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);
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);
p1和p2都有按钮等组件

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

我尝试更改JLayeredPane()的布局

例如,我做到了:

lp.setLayout(new BoxLayout(lp, BoxLayout.X_AXIS));
然后,JPanel确实会显示,但它们是相邻显示的,与JLayeredPane的层无关

我是否被迫使用空布局

如何使我的JLayeredPane尊重图层并正确显示我的双框布局JPanel


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

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

如果您只想将内容覆盖在彼此之上,可以使用如下LayoutManager:

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

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

如果您只想将内容覆盖在彼此之上,可以使用如下LayoutManager:

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);
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的行为就好像它在使用null布局一样。将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());

JLayeredPane的行为就好像它在使用null布局一样。将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_层而不是0


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

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

lp.setLayer(p1, 1);
lp.setLayer(p2, 0);
lp.add(p1);
lp.add(p2);
必须在添加组件之前定义图层。 您也可以尝试使用JLayeredPane.DEFAULT_层而不是0


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

永远不要使用
null
布局。这就是问题所在:--
add()的第二个参数
必须是
整数
而不是
int
,因为方法的
int
版本不同。当我不建立布局时,不会显示任何内容。当我添加任何布局时,它的行为就好像它不是一个分层窗格,并在视觉上添加彼此相邻的组件,而不是一个在另一个之上。感谢您的整数问题。但是,当我使用Integer时,它仍然像常规布局一样工作。它添加彼此相邻的面板,即使它们应该位于不同的层中。JLayeredPane的行为就像它使用空布局一样。将JPanel添加到JLayeredPane时,必须指定其大小和位置。切勿使用
null
布局。这是问题所在:--
add()
的第二个参数必须是
Integer
而不是
int
,因为该方法的
int
版本不同。如果我不建立布局,什么也没有出现。当我添加任何布局时,它的行为就好像它不是一个分层窗格,并在视觉上添加彼此相邻的组件,而不是一个在另一个之上。感谢您的整数问题。但是,当我使用Integer时,它仍然像常规布局一样工作。它添加彼此相邻的面板,即使它们应该位于不同的层中。JLayeredPane的行为就像它使用空布局一样。在将JPanel添加到JLayeredPane时,您必须指定它的大小和位置。这很有效-尽管我遇到的唯一问题是,当我在每个层上都有组件时,下面层中的一些组件尝试从槽中弹出到顶部(当我将光标悬停在它们上时)。我可以通过简单地将下面层的所有组件设置为disabled(
setEnabled(false)
)来消除这种行为,因为毕竟,如果它们当前处于隐藏状态,则无法启用它们-这只会增加额外的一点开销。这很好-尽管我遇到的唯一问题是,当我在这些层中的每一层上都有组件时,下面层中的一些组件尝试从槽中弹出到顶部(当我将光标悬停在它们上时)。我可以通过简单地将下面层的所有组件设置为disabled(
setEnabled(false)
)来消除这种行为,因为毕竟,如果它们当前处于隐藏状态,则它们没有业务被启用-这只会增加额外的一点开销。