Как придерживаться верхней части контейнера в BoxLayout
У меня есть родительский JPanel с макетом Y_AXIS. Дочерние элементы этого контейнера также являются JPanels. Компоненты отлично укладываются и все выровнены, но я хочу, чтобы они придерживались верхней части родительского JPanel, чтобы все лишнее пространство находилось внизу, и между компонентами не было дополнительного пространства. Я пытался использовать клей, но я могу делать что-то не так. Я также установил AllignmentX и AllignmentY влево и вверх соответственно для всех детей.
Итак, что я хочу, так это стек дочерних элементов в родительской панели, который не растягивается по высоте и прилипает к вершине (и, если возможно, слева) родительского контейнера со всем лишним пространством, размещенным в нижней части, как таковой.:
РЕДАКТИРОВАТЬ:
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;
}
2 ответа
Предполагая, что layoutManager содержащей панели (то есть, тот, который передан в initContent) имеет горизонтальный BoxLayout
- удалить все клеящие вещества
- установить выравнивание как info/listPanel вверху
- реализовать 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));
Пока вы в этом: удалите все setXXSize - жесткие размеры кодирования неправильны, некоторые причины.
Попробуйте удалить клей в верхней части контейнера и вместо этого добавить его в нижнюю часть.
Измененный код:
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));
[...]}