Java Swing LayoutПроблема

Я разрабатываю приложение с помощью Java и библиотеки Swing (я также могу использовать фрагменты AWT), и мне нужна помощь с «нестандартным» макетом.

У меня есть большая панель JScrollPanel, куда я динамически вставляю панели JPanel переменной высоты внутри. Вот более-менее реальный рисунок:

|-------------------------------- JScrollPane ------------------------------|
| |------------------------------- JPanel --------------------------------| |
| |                                                                       | |
| |-----------------------------------------------------------------------| |
|                                                                           |
| |------------------------------- JPanel --------------------------------| |
| |                                                                       | |
| |                                                                       | |
| |-----------------------------------------------------------------------| |
|                                                                           |
|---------------------------------------------------------------------------|

Тогда я не знаю, какие макеты используют... Я бы хотел, чтобы mainLayout не изменял высоту моих внутренних панелей JPanel, а изменял их ширину. Поэтому, когда я расширяю окно, например, я хочу, чтобы мои внутренние макеты оставались близко к левой и правой границе, но не расширялись по вертикали.

Любое предложение?

Я надеюсь, что мой английский и объяснения были не так уж плохи. Спасибо за чтение!


person Jerome    schedule 07.11.2013    source источник
comment
Кажется, вам нужен вертикальный блок Box.createVerticalBox()   -  person michael nesterenko    schedule 08.11.2013


Ответы (1)


В этом случае я мог бы использовать макет GridBagLayout или VerticalLayout (из библиотеки SwingLabs, SwingX) (но когда у вас есть только молоток, все выглядит как гвоздь ;)).

Чтобы использовать GridBagLayout, вам нужно будет предоставить соответствующие ограничения, которые будут указывать менеджеру компоновки заполнять панель по горизонтали, но учитывать высоту.

GridBagConstraints gbc = new GridBagConstraints();
gbc.gridwidth = GridBagConstraints.REMAINDER;
gbc.weightx = 1;
gbc.fill = GridBagConstraints.HORIZONTAL;

Единственная проблема заключается в том, что GridBagLayout любит центрировать свои компоненты вокруг центральной позиции родительского контейнера. Возможно, вам потребуется добавить компонент «заполнитель» в последнюю позицию, которая занимает оставшееся пространство по вертикали.

gbc.weighty = 1;

Должно хватить

Дополнительные сведения см. в разделе Как использовать GridBagLayout.

Обновление с очень простым примером...

// Basic constraints...
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridwidth = GridBagConstraints.REMAINDER;
gbc.weightx = 1;
gbc.fill = GridBagConstraints.HORIZONTAL;

// Add your components...
add(panel, gbc);
//...

// Then add a fill component to push the layout to the top...
gbc.weighty = 1;
add(new JPanel(), gbc);
// You can use a constant value if you want, as it will be easier to remove
// so you can add new components to the end and re-add it when you're done
person MadProgrammer    schedule 07.11.2013
comment
Спасибо за быстрый ответ. Эта реализация делает довольно много работы, но я все еще получаю свои JPanels в середине моей основной JScrollPane по вертикали. Я пытался использовать gbc.weithy = 1; но вроде ничего особенного :( - person Jerome; 08.11.2013
comment
Идеальный! Спасибо за прокомментированный пример! - person Jerome; 08.11.2013