组件未对齐

时间:2013-08-08 22:13:44

标签: java swing user-interface

我知道我已经问过这个问题,但是由于我在示例代码中的错误以及未能真正提出问题,前几个小时已经过去了,我很少得到任何新的评论或对旧问题的答案。原件被删除了。

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

        setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
        setBackground(Color.YELLOW);
        setFixedSize(new Dimension(LayoutConstants.PAGE_WIDTH + 2*LayoutConstants.HALF_SPACE_BETWEEN_PAGES, LayoutConstants.PAGE_HEIGHT + 2*LayoutConstants.HALF_SPACE_BETWEEN_PAGES));
        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));
        add(header);

        elementContainer = new JPanelSize();
        elementContainer.setLayout(new BoxLayout(elementContainer, BoxLayout.Y_AXIS));
        elementContainer.setBackground(Color.GREEN);
        elementContainer.setFixedSize(new Dimension(LayoutConstants.CONTENT_WIDTH, LayoutConstants.CONTENT_HEIGHT));        
        add(elementContainer, BorderLayout.CENTER);


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

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

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

这就是结果:

enter image description here

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

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

我做错了什么?

2 个答案:

答案 0 :(得分:3)

“我做错了什么?”使用单一布局来实现每件事。 BorderLayout可以达到页眉和页脚的要求,然后你可以继续使用BoxLayout作为正文

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

答案 1 :(得分:1)

技术原因(部分猜测,因为你仍然没有像SSCCE那样显示任何东西)是BoxLayout的一种特殊性:它需要它的孩子在垂直于它自己的轴上具有完全相同的对齐。也就是说,外部y盒的所有子元素必须具有完全相同的x对齐。如果不满足该条件,结果是不直观的(教程有一些例子)这里的对齐不匹配是在页眉/页脚与elementContainer之间:前者是中心对齐的,后者的对齐是由其LayoutManager计算的,并且是0 。

在下面的实验中,我可以重现页脚的移位,打印不对齐X:

header/content/footer: 0.5/0.0/0.5

包含任意LayoutConstraints

的代码段
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 ;
}