2012-07-28 2 views
2

У меня есть родительский JPanel с макетом Y_AXIS. Дети этого контейнера также являются JPanels. Компоненты укладываются в порядке, и все они привязаны, но я хочу, чтобы они придерживались вершины родительского JPanel, поэтому все лишнее пространство находится внизу, и между компонентами нет лишнего пространства. Я пробовал использовать клей, но я мог бы сделать что-то неправильно. Я также установил AllignmentX и AllignmentY влево и вверх соответственно для всех детей.Как придерживаться контейнера в BoxLayout

Таким образом, я хочу, чтобы стек родительской панели находился на родительской панели, не растянутой по высоте, и придерживался вершины (и слева, если возможно) родительского контейнера со всем избыточным пространством, помещенным в нижний, как например:

EDIT:

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

+0

убедитесь, что все дети реализуют getMaximumSize() с чем-то разумным: BoxLayout никогда не будет их больше размера – kleopatra

ответ

4

Предполагая, что LayoutManager вмещающего панели (то есть один передается в initContent) имеет horizontalBoxLayout

  • удалить все клей StuFF
  • набор alignmentY как info/listPanel to top
  • реализовать getMaximum of the infoPanel t о возвращает его прив

что-то вроде (границы просто визуализировать, какой контейнер, где, часто трудно решить, с такой вложенности :)

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

Блестящая идея. Границы показали, что проблема не в внутренней панели. Но внешняя панель передается методу. –

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

It не имело никакого значения. Он выглядит точно так же –

 Смежные вопросы

  • Нет связанных вопросов^_^