Java 如何在BoxLayout中粘贴到容器顶部

Java 如何在BoxLayout中粘贴到容器顶部,java,swing,layout,boxlayout,Java,Swing,Layout,Boxlayout,我有一个Y_轴布局的父JPanel。这个容器的子容器也都是JPanel。 组件堆叠得很好,并且都对齐了,但是我希望它们粘在父JPanel的顶部,这样所有多余的空间都在底部,并且组件之间没有额外的空间。我试过用胶水,但我可能做错了什么。我还将AllignmentX和AllignmentY分别设置为左侧和顶部 因此,我想要的是父面板中的一堆子对象,这些子对象在高度上没有拉伸,并且粘附在父容器的顶部(如果可能,则在左侧),所有多余的空间都放置在底部,例如: 编辑: 尝试去除容器顶部的胶水,然后将其添加

我有一个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(Box.createVerticalGlue());

       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(Box.createVerticalGlue());

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