2013-11-07 3 views
0

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

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

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

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

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

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

+0

Это кажется вам нужно вертикальное окно 'Box.createVerticalBox()' –

ответ

1

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

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

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

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

gbc.weighty = 1; 

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

Взгляните на How to use 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 
+0

Спасибо за быстрый ответ. Эта реализация выполняет совершенно определенную работу, но я по-прежнему получаю свои JPanels в середине моего основного JScrollPane по вертикали. Я попытался использовать «gbc.weithy = 1;» но он не делает ничего особенного :( – Jerome

+0

Вам нужно добавить панель «filler» до конца ... – MadProgrammer

+0

Отлично! Спасибо за комментарий! – Jerome