【问题标题】:How to stick to top of container in BoxLayout如何在 BoxLayout 中粘在容器顶部
【发布时间】:2012-07-28 07:58:11
【问题描述】:

我有一个带有 Y_AXIS 布局的父 JPanel。这个容器的子容器也是 JPanel。 组件堆叠良好,并且全部对齐,但我希望它们粘在父 JPanel 的顶部,因此所有多余的空间都在底部,并且组件之间没有额外的空间。我试过用胶水,但我可能做错了什么。我还在所有子节点上分别将 AllignmentX 和 AllignmentY 设置为 left 和 top。

所以,我想要的是父面板中的一堆子元素,它们的高度没有被拉伸,并且粘在父容器的顶部(如果可能的话,在左侧),所有多余的空间都放在底部,因此:

编辑:

protected void initContent(JPanel panel) {
    id = new JTextField();
    typename = new JTextField();
    currentstep = new JComboBox();
    currentowner = new JComboBox();
    organization = new JTextField();
    area = new JTextField();
    active = new JLabel();
    finished = new JLabel();
    fields = new JList();
    linkedassignments = new JList();
    jobs = new JList();
    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("Type", typename, 50, 100));
    infopanel.add(makeInfoContainer("Organization", organization, 50, 100));
    infopanel.add(makeInfoContainer("Area", area, 50, 100));
    infopanel.add(makeInfoContainer("Active", active, 50, 100));
    infopanel.add(makeInfoContainer("Finished", finished, 50, 100));
    infopanel.add(makeInfoContainer("Step", currentstep, 50, 100));
    infopanel.add(makeInfoContainer("Owner", currentowner, 50, 100));
    listpanel.setLayout(new GridLayout(0,1,5,5));
    listpanel.add(makeJListContainer("Fields", fields, 200, 200));
    listpanel.add(makeJListContainer("Assignments", linkedassignments, 200, 200));
    listpanel.add(makeJListContainer("Jobs", jobs, 200, 200));
    panel.add(infopanel);
    panel.add(listpanel);
}


private Container makeInfoContainer(String name, Component comp, int labelwidth, int compwidth){
    JPanel cont = new JPanel();
    cont.setAlignmentY(Container.TOP_ALIGNMENT);
    cont.setLayout(new FlowLayout(FlowLayout.LEFT, 5, 0));
    JLabel lbl = new JLabel(name);
    lbl.setPreferredSize(new Dimension(labelwidth, 25));
    cont.add(lbl);
    comp.setPreferredSize(new Dimension(compwidth, 25));
    cont.add(comp);
    return cont;
}

private Container makeJListContainer(String name, JList list, int areawidth, int areaheight){
    Box cont = new Box(BoxLayout.Y_AXIS);
    cont.setPreferredSize(new Dimension(areawidth, areaheight));
    JLabel label = new JLabel(name);
    cont.add(Box.createHorizontalGlue());
    cont.add(label);
    JScrollPane pane = new JScrollPane();
    pane.setAlignmentY(Component.TOP_ALIGNMENT);
    pane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
    pane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
    pane.add(jobs);
    cont.add(pane);
    return cont;
}

【问题讨论】:

  • 您可以上传图片和/或示例代码,这真的很有帮助。我会看看其他一些布局管理器,我认为它不会做你想要的
  • 确保孩子们都以合理合理的方式实现 getMaximumSize():BoxLayout 永远不会将它们的大小设置得比这更大

标签: java swing layout boxlayout


【解决方案1】:

假设包含面板的layoutManager(也就是传入initContent的那个)有一个horizo​​ntalBoxLayout

  • 去除所有胶水
  • 将两个 info/listPanel 的 alignmentY 设置为顶部
  • 实现 infoPanel 的 getMaximum 以返回其首选项

类似的东西(边框只是为了可视化哪个容器在哪里,通常很难用这么多的嵌套来决定:)

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

当你这样做时:删除 all setXXSize - 硬编码大小是错误的,some reasons

【讨论】:

  • 好主意。边框表明问题不在于内部面板。但是外部面板被传递给方法。
【解决方案2】:

尝试去除容器顶部的胶水并将其添加到底部。

更改代码:

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));
       [...]
}

【讨论】:

  • 没什么区别。看起来一模一样
猜你喜欢
  • 1970-01-01
  • 2013-08-30
  • 1970-01-01
  • 1970-01-01
  • 2018-09-17
  • 1970-01-01
  • 2013-10-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多