Java 部件错位

Java 部件错位,java,swing,user-interface,Java,Swing,User Interface,我知道我已经问过这个问题了,但是由于我在示例代码中犯了错误并且没有真正问这个问题,最初的几个小时已经过去了,我很少得到任何新的评论或对旧问题的回答。原文被删除 我使用此代码生成下面的窗口(确切地说,橙色矩形中的所有内容): 这是JPanelize类,它极大地简化了我的生活: import java.awt.Dimension; import javax.swing.JPanel; public class JPanelSize extends JPanel { private sta

我知道我已经问过这个问题了,但是由于我在示例代码中犯了错误并且没有真正问这个问题,最初的几个小时已经过去了,我很少得到任何新的评论或对旧问题的回答。原文被删除

我使用此代码生成下面的窗口(确切地说,橙色矩形中的所有内容):

这是JPanelize类,它极大地简化了我的生活:

import java.awt.Dimension;

import javax.swing.JPanel;

public class JPanelSize extends JPanel
{
    private static final long serialVersionUID = 1L;

    public void setFixedSize(Dimension size)
    {
        setMinimumSize(size);
        setPreferredSize(size);
        setMaximumSize(size);
    }
}
这就是结果:

页眉和页脚应填充黄色区域,而绿色JPanel应居中。高度都很好

我重写set(…)Size()方法,因为我在这里模拟A4

我做错了什么?

“我做错了什么?”使用单一布局实现每件事。BorderLayout将满足页眉和页脚的要求,然后您可以继续对正文使用BoxLayout

这通常被称为复合布局,在处理复杂的布局需求时非常有用

“我做错了什么?”使用单一布局实现每一件事。BorderLayout将满足页眉和页脚的要求,然后您可以继续对正文使用BoxLayout

这通常被称为复合布局,在处理复杂的布局要求时非常有用。

一个技术原因(部分是猜测,因为您仍然没有显示任何类似SSCCE的内容)是BoxLayout的一个特殊之处:它需要其子项在垂直于自身的轴上具有完全相同的对齐方式。也就是说,外部y形盒的所有子项必须具有完全相同的x对齐。如果不满足该条件,则结果是不直观的(本教程有一些示例)。此处,对齐不匹配是页眉/页脚与elementContainer之间的不匹配:前者居中对齐,后者的对齐由其LayoutManager计算,为0

在下面的实验中,我可以复制页脚的移动,即打印出的alignmentX:

header/content/footer: 0.5/0.0/0.5
具有任意布局约束的代码段

JPanelSize content = new JPanelSize();
content.setLayout(new BoxLayout(content, BoxLayout.Y_AXIS));
content.setBackground(Color.YELLOW);
content.setFixedSize(new Dimension(
    LayoutConstants.PAGE_WIDTH + 2*LayoutConstants.HALF_SPACE_BETWEEN_PAGES, 
    LayoutConstants.PAGE_HEIGHT + 2*LayoutConstants.HALF_SPACE_BETWEEN_PAGES));
content.setBorder(BorderFactory.createLineBorder(Color.ORANGE, 
    LayoutConstants.HALF_SPACE_BETWEEN_PAGES));

JPanelSize header = new JPanelSize();
header.setBackground(Color.RED);
header.setSize(new Dimension(LayoutConstants.PAGE_WIDTH, 
        LayoutConstants.HEADER_HEIGHT));
content.add(header);

JPanelSize elementContainer = new JPanelSize();
// comment the following line to make the container centered
elementContainer.setLayout(new BoxLayout(elementContainer, BoxLayout.Y_AXIS));
elementContainer.setBackground(Color.GREEN);
elementContainer.setFixedSize(new Dimension(LayoutConstants.CONTENT_WIDTH, 
        LayoutConstants.CONTENT_HEIGHT));        
content.add(elementContainer);

JPanelSize footer = new JPanelSize();
footer.setBackground(Color.MAGENTA);
footer.setFixedSize(new Dimension(LayoutConstants.PAGE_WIDTH, 
        LayoutConstants.FOOTER_HEIGHT));
content.add(footer);

LOG.info("header/content/footer: " 
        + header.getAlignmentX()
        + "/" + elementContainer.getAlignmentX()
        + "/" + footer.getAlignmentX()
        );
frame.setContentPane(content);

// some sizes 
public static class LayoutConstants {
    public static int CONTENT_WIDTH = 300;
    public static int CONTENT_HEIGHT = 700;
    public static int FOOTER_HEIGHT = 30;
    public static int HEADER_HEIGHT = FOOTER_HEIGHT;
    public static int HALF_SPACE_BETWEEN_PAGES = 10;
    public static int PAGE_WIDTH = 400;
    public static int PAGE_HEIGHT = CONTENT_HEIGHT 
            + FOOTER_HEIGHT + HEADER_HEIGHT ;
}
一个技术原因(部分是猜测,因为您仍然没有显示任何类似SSCCE的内容)是BoxLayout的一个特殊性:它需要其子对象在垂直于其子对象的轴上具有完全相同的对齐方式。也就是说,外部y形盒的所有子项必须具有完全相同的x对齐。如果不满足该条件,则结果是不直观的(本教程有一些示例)。此处,对齐不匹配是页眉/页脚与elementContainer之间的不匹配:前者居中对齐,后者的对齐由其LayoutManager计算,为0

在下面的实验中,我可以复制页脚的移动,即打印出的alignmentX:

header/content/footer: 0.5/0.0/0.5
具有任意布局约束的代码段

JPanelSize content = new JPanelSize();
content.setLayout(new BoxLayout(content, BoxLayout.Y_AXIS));
content.setBackground(Color.YELLOW);
content.setFixedSize(new Dimension(
    LayoutConstants.PAGE_WIDTH + 2*LayoutConstants.HALF_SPACE_BETWEEN_PAGES, 
    LayoutConstants.PAGE_HEIGHT + 2*LayoutConstants.HALF_SPACE_BETWEEN_PAGES));
content.setBorder(BorderFactory.createLineBorder(Color.ORANGE, 
    LayoutConstants.HALF_SPACE_BETWEEN_PAGES));

JPanelSize header = new JPanelSize();
header.setBackground(Color.RED);
header.setSize(new Dimension(LayoutConstants.PAGE_WIDTH, 
        LayoutConstants.HEADER_HEIGHT));
content.add(header);

JPanelSize elementContainer = new JPanelSize();
// comment the following line to make the container centered
elementContainer.setLayout(new BoxLayout(elementContainer, BoxLayout.Y_AXIS));
elementContainer.setBackground(Color.GREEN);
elementContainer.setFixedSize(new Dimension(LayoutConstants.CONTENT_WIDTH, 
        LayoutConstants.CONTENT_HEIGHT));        
content.add(elementContainer);

JPanelSize footer = new JPanelSize();
footer.setBackground(Color.MAGENTA);
footer.setFixedSize(new Dimension(LayoutConstants.PAGE_WIDTH, 
        LayoutConstants.FOOTER_HEIGHT));
content.add(footer);

LOG.info("header/content/footer: " 
        + header.getAlignmentX()
        + "/" + elementContainer.getAlignmentX()
        + "/" + footer.getAlignmentX()
        );
frame.setContentPane(content);

// some sizes 
public static class LayoutConstants {
    public static int CONTENT_WIDTH = 300;
    public static int CONTENT_HEIGHT = 700;
    public static int FOOTER_HEIGHT = 30;
    public static int HEADER_HEIGHT = FOOTER_HEIGHT;
    public static int HALF_SPACE_BETWEEN_PAGES = 10;
    public static int PAGE_WIDTH = 400;
    public static int PAGE_HEIGHT = CONTENT_HEIGHT 
            + FOOTER_HEIGHT + HEADER_HEIGHT ;
}

“我做错了什么?”使用单一布局实现每一件事。BorderLayout可以满足页眉和页脚的要求,然后您可以继续为bodyMake使用BoxLayout,这样我就可以勾选它了。但我还是不明白为什么这种行为。。。我认为它应该与我的设置一起工作,不管它有多糟糕。。。我将使用您的方法,但我只是感到困惑…对不起,我不使用BoxLayout,更喜欢GridBagLayout;)“我做错了什么?”使用单一布局实现每一件事。BorderLayout可以满足页眉和页脚的要求,然后您可以继续为bodyMake使用BoxLayout,这样我就可以勾选它了。但我还是不明白为什么这种行为。。。我认为它应该与我的设置一起工作,不管它有多糟糕。。。我将使用您的方法,但我只是感到困惑…对不起,我不使用BoxLayout,更喜欢GridBagLayout;)另请参阅以了解想法。使用功能不够强大的layoutManager是错误的做法-嵌套布局有其自身的问题:-)@Karlovsky120在您的永无止境的问题故事中,您不是曾经使用过MigLayout吗?顺便说一句,min=max=pref听起来非常粘。。。mig不需要,它尊重您在管理层配置的任何尺寸。@kleopatra“嵌套布局有自己的问题”-同意,没有进一步的上下文,很难提供完整的证明答案。self注意,必须花时间查看MigLayout:PSee也可以了解想法。使用功能不够强大的layoutManager是错误的做法-嵌套布局有自己的问题:-)@Karlovsky120在你永无止境的问题故事中,你不是曾经使用过MigLayout吗?顺便说一句,min=max=pref听起来非常粘。。。mig不需要,它尊重您在管理层配置的任何尺寸。@kleopatra“嵌套布局有自己的问题”-同意,没有进一步的上下文,很难提供完整的证明答案。请注意,必须抽出时间查看MIGLOUT:P