gpt4 book ai didi

java - 如何在 BoxLayout 中坚持到容器的顶部

转载 作者:行者123 更新时间:2023-11-30 06:29:14 25 4
gpt4 key购买 nike

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

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

编辑:

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

Window resulting from code

最佳答案

假设包含面板的布局管理器(即传递到 initContent 的面板)有一个 horizo​​ntalBoxLayout

  • 去除所有胶水
  • 设置info/listPanel的alignmentY到顶部
  • 实现 infoPanel 的 getMaximum 以返回其 pref

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

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

同时:删除所有 setXXSize - 硬编码大小错误,some reasons .

关于java - 如何在 BoxLayout 中坚持到容器的顶部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11699311/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com