Java 如何在BoxLayout中粘贴到容器顶部
我有一个Y_轴布局的父JPanel。这个容器的子容器也都是JPanel。 组件堆叠得很好,并且都对齐了,但是我希望它们粘在父JPanel的顶部,这样所有多余的空间都在底部,并且组件之间没有额外的空间。我试过用胶水,但我可能做错了什么。我还将AllignmentX和AllignmentY分别设置为左侧和顶部 因此,我想要的是父面板中的一堆子对象,这些子对象在高度上没有拉伸,并且粘附在父容器的顶部(如果可能,则在左侧),所有多余的空间都放置在底部,例如: 编辑:Java 如何在BoxLayout中粘贴到容器顶部,java,swing,layout,boxlayout,Java,Swing,Layout,Boxlayout,我有一个Y_轴布局的父JPanel。这个容器的子容器也都是JPanel。 组件堆叠得很好,并且都对齐了,但是我希望它们粘在父JPanel的顶部,这样所有多余的空间都在底部,并且组件之间没有额外的空间。我试过用胶水,但我可能做错了什么。我还将AllignmentX和AllignmentY分别设置为左侧和顶部 因此,我想要的是父面板中的一堆子对象,这些子对象在高度上没有拉伸,并且粘附在父容器的顶部(如果可能,则在左侧),所有多余的空间都放置在底部,例如: 编辑: 尝试去除容器顶部的胶水,然后将其添加
尝试去除容器顶部的胶水,然后将其添加到底部 更改代码:
protected void initContent(JPanel panel) {
[...]
JPanel infopanel = new JPanel();
JPanel listpanel = new JPanel();
infopanel.setLayout(new BoxLayout(infopanel, BoxLayout.Y_AXIS));
infopanel.add(makeInfoContainer("Id", id, 50, 100));
[...]
infopanel.add(makeInfoContainer("Owner", currentowner, 50, 100));
infopanel.add(Box.createVerticalGlue());
listpanel.setLayout(new GridLayout(0,1,5,5));
[...]
}
假设包含面板(即传递到initContent的面板)的layoutManager具有horizontalBoxLayout
- 去掉所有的胶水
- 将两个信息/列表面板的对齐设置为顶部
- 实现infoPanel的getMaximum以返回其pref
当你这样做时:删除所有setXXSize-硬编码大小是错误的。你可以上传图像和/或示例代码,这将非常有帮助。我会看看其他一些布局管理器,我不认为它会做你想做的事情确保孩子们都用合理的方式实现getMaximumSize():BoxLayout永远不会将他们的大小设置得比这更大,这没有什么区别。这看起来正是同样的想法。边界显示问题不在于内部面板。但是传递给方法的外部面板。
protected void initContent(JPanel panel) {
[...]
JPanel infopanel = new JPanel();
JPanel listpanel = new JPanel();
infopanel.setLayout(new BoxLayout(infopanel, BoxLayout.Y_AXIS));
infopanel.add(makeInfoContainer("Id", id, 50, 100));
[...]
infopanel.add(makeInfoContainer("Owner", currentowner, 50, 100));
infopanel.add(Box.createVerticalGlue());
listpanel.setLayout(new GridLayout(0,1,5,5));
[...]
}
JComponent panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.LINE_AXIS));
panel.setBorder(BorderFactory.createLineBorder(Color.GREEN));
initContent(panel);
// in initContent
JPanel infopanel = new JPanel() {
@Override
public Dimension getMaximumSize() {
return getPreferredSize();
}
};
infopanel.setBorder(BorderFactory.createLineBorder(Color.RED));
infopanel.setAlignmentY(0f);
infopanel.setLayout(new BoxLayout(infopanel, BoxLayout.Y_AXIS));
JPanel listpanel = new JPanel();
listpanel.setBorder(BorderFactory.createLineBorder(Color.BLUE));
listpanel.setAlignmentY(0f);
listpanel.setLayout(new GridLayout(0,1,5,5));