2010-08-03 6 views
6

Я создал JFrame, инициализированный BorderLayout и JScrollPane как элемент CENTER.FlowLayout Java не изменяет размер правильно

В области прокрутки установлены политики VERTICAL_SCROLLBAR_ALWAYS и HORIZONTAL_SCROLLBAR_NEVER. Цель моего frame - иметь контролируемую ширину, а высота должна увеличиваться/уменьшаться по мере добавления/удаления данных.

scroll pane Внутри мой, я добавил простой JPanel (позволяет назвать это панель контента), который инициализируется с FlowLayoutLEADING политикой).

Чтобы проверить это, я просто заполняю content panel компонентами 20 JLabel("Item " + n), где n - это счетчик циклов.

Я бы ожидал увидеть мой labels, показанный на одной строке, если frame достаточно большой, и этикетки переносятся на другие линии, когда я уменьшаю ширину. Но вместо этого есть только одна строка, отображаемая без упаковки ... когда-либо.

Кто-нибудь знает, почему flow layout не обертывается, когда участвует scroll pane?

Если удалить scroll pane все вместе и поставить content panel непосредственно в frame, желаемый эффект обертывания происходит, но если frame высота усадку меньше content panel высоты он просто исчезает.

Идея состоит в том, что я хочу, чтобы мой labels был обернут, когда это необходимо, но также всегда будет видимым, если это означает, что вам нужно прокручивать вверх/вниз.

Любые предложения о том, как исправить это?

Спасибо.

ответ

9

Wrap Layout дает объяснение и решение.

+0

Кажется, что она работает точно так же, как нужно/ожидалось до сих пор! Будем надеяться, что Oracle инвестирует больше в Swing, чем Sun! Большое спасибо! – Jeach

+0

Не могли бы вы сказать, что у FlowLayout есть ошибки или вы думаете, что это было намерение Sun вести себя таким образом? WrapLayout делает гораздо больше смысла, он должен быть частью Swing! – Jeach

+0

Это не ошибка, потому что нет кода, который пытается динамически пересчитать предпочтительный размер. Это именно то, как кто-то задумал работать. – camickr

0

Если вы работаете с десеннером, вы должны установить свойство preferredSize равным null (удалить то, что установлено), а затем установить предпочтительный размер, щелкнув кнопку тройных точек [...] рядом с именем свойства preferisize и положив ваше предпочтение.

Я столкнулся с той же проблемой, и она работает для меня