我知道我已经问过这个问题,但是由于我在示例代码中的错误以及未能真正提出问题,前几个小时已经过去了,我很少得到任何新的评论或对旧问题的答案。原件被删除了。
我使用此代码生成下面的窗口(确切地说,橙色矩形内的所有内容):
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);
}
}
这就是结果:
页眉和页脚应填充黄色区域,而绿色JPanel应居中。高度都很好。
我重写了set(...)Size()方法,因为我在这里模拟A4。
我做错了什么?
答案 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 ;
}