Как установить только предпочтительную ширину панели с макетом потока?

У меня есть панель с потоковой компоновкой, и она может содержать переменное количество элементов - от 1 до 2000. Я хочу поместить ее в панель прокрутки, прокручиваемую в вертикальном направлении и с фиксированной шириной. Проблема в том, что когда я устанавливаю предпочтительный размер панели примерно (800 600), некоторые элементы отсутствуют, и нет прокрутки. Если я установлю предпочтительный размер области прокрутки, то все элементы в области потока помещаются в одну очень длинную строку.

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

Как я могу это исправить?


person Rogach    schedule 03.10.2011    source источник
comment
from 1 to really big numbers есть какая-то логика   -  person mKorbel    schedule 03.10.2011
comment
Добавил несколько лучших номеров :) Простите мой плохой английский.   -  person Rogach    schedule 03.10.2011
comment
делать. нет. использовать. установитьXXРазмер. Вместо этого используйте соответствующий LayoutManager   -  person kleopatra    schedule 03.10.2011
comment
хммм, многие LayoutManagers игнорируют setXxxSize, ваш вопрос добавлен для sscce.org, есть бесконечные варианты, начинающиеся с вложенного макета в GridBagLayout   -  person mKorbel    schedule 03.10.2011
comment
@kleopatra - но когда мне действительно нужен какой-то элемент определенного размера?   -  person Rogach    schedule 03.10.2011
comment
@Rogach: я вижу, что я не единственный, кто борется с PreferredSizeMethod :). Вот предыдущий вопрос, который может показаться вам интересным: stackoverflow.com/questions/7229226/   -  person Heisenbug    schedule 03.10.2011
comment
@kleopatra: я жду вашего отрицательного ответа на мой ответ :). Я шучу, но, пожалуйста, поправьте меня, если я ошибаюсь.   -  person Heisenbug    schedule 03.10.2011
comment
используйте приличный LayoutManager и сообщите менеджеру, какие правила размера/изменения размера вы хотите. Кстати, а зачем вам фиксированный размер? Это рано или поздно сломается (последнее, когда вы переключитесь на устройство с другим разрешением)   -  person kleopatra    schedule 03.10.2011
comment
Вы также должны взглянуть на интерфейс Scrollable и реализовать его на своей панели: это позволит выполнять определенное поведение прокрутки.   -  person jfpoilpret    schedule 03.10.2011
comment
сообщите менеджеру, какие правила размера/изменения размера вам нужны. Хотел бы я вознаградить @kleopatra за этот комментарий.   -  person Matthieu    schedule 04.02.2019


Ответы (2)


Вы можете использовать BoxLayout для этого:

JPanel verticalPane = new JPanel();
verticalPane.setLayout(new BoxLayout(verticalPane, BoxLayout.Y_AXIS));

JScrollPane pane = new JScrollPane(verticalPane);

//add what you want to verticalPane
verticalPane.add(new JButton("foo"));
verticalPane.add(new JButton("bar"));

Это, конечно, будет использовать предпочтительный размер каждого добавленного компонента. Если вы хотите изменить предпочтительный размер, например, для JPanel, расширьте его и переопределите getPreferredSize:

class MyPanel extends JPanel(){
    public Dimension getPreferredSize(){
         return new Dimension(100,100);
    }
} 

Примечание: BoxLayout будет учитывать getPreferredSize, а другой LayoutManager — нет.

Пожалуйста, раскритикуйте мой ответ, я не уверен, что он полностью правильный, и мне любопытно услышать возражения, чтобы узнать, понял ли я проблему.

person Heisenbug    schedule 03.10.2011
comment
«Это, конечно, будет использовать предпочтительный размер каждого добавленного компонента», конечно, неправильно (или не совсем правильно, немного зависит от того, что вы подразумеваете под использованием ;-) LayoutManagers могут делать все, что им нравится, с подсказками, данными компоненты. Переопределение getXXSize — правильное направление, хотя жестко закодированные значения почти так же плохи, как и их установка. Просто используйте приличный LayoutManager и настройте его с любыми правилами определения размеров, которые вам нужны. - person kleopatra; 03.10.2011

Я хочу поместить его в панель прокрутки, прокручиваемую в вертикальном направлении и с фиксированной шириной

Для этого можно использовать макет переноса.

Не устанавливайте предпочтительный размер панели. Но вы можете установить предпочтительный размер области прокрутки, чтобы метод frame.pack() работал.

person camickr    schedule 03.10.2011