2012-07-28 59 views
2

我有一个具有Y_AXIS布局的父级JPanel。这个容器的孩子们也都是JPanels。 组件堆叠良好,并且都已经被分配,但是我希望它们坚持到父JPanel的顶部,因此所有多余的空间都位于底部,组件之间没有额外的空间。我尝试过使用胶水,但我可能做错了什么。我还将AllLocalX和AllLayy分别设置在所有孩子的左侧和顶部。如何粘贴到BoxLayout中的容器顶部

所以,我想要的是在父面板中的一堆儿童,这是不拉伸的高度,并坚持父容器的顶部(和左,如果可能),所有多余的空间放置在底,因为这样的:

编辑:

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

+0

你可以上传图片和/或示例代码,这真的有帮助。我想看看其他一些布局管理器,我不认为它会做你想做的事情 – MadProgrammer 2012-07-28 08:05:08

+0

确保孩子们都用合理的合理实现getMaximumSize():BoxLayout永远不会将它们的尺寸调整为比它大 – kleopatra 2012-07-28 08:48:58

回答

4

假设含有面板的LayoutManager的(即所述一个传递到initContent)具有horizo​​ntalBoxLayout

  • 除去所有的胶料
  • 集info/listPanel的对齐方式 top
  • 实现infoPanel的getMaximum t O返回其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

+0

好主意。边界显示问题不在于内部面板。但外面的面板被传递给了方法。 – 2012-07-28 11:05:46

1

尝试在容器的顶部去除胶,并将其添加至底部来代替。

改变的代码:

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

它没有区别。它看起来完全一样 – 2012-07-28 10:19:10

相关问题