Сожмите JScroll Pane до той же высоты, что и JTable - PullRequest
19 голосов
/ 29 июня 2011

В настоящее время у меня есть JTables, вложенные в JScrollPanes, например:

enter image description here

Моя проблема в том, что количество строк в каждой таблице является переменным при создании таблицы. Я хочу сделать JScrollpane меньше, если таблица слишком короткая, но я хочу сохранить ее на заданном размере, если таблица слишком длинная.

Как мне это сделать?

Ответы [ 5 ]

22 голосов
/ 29 июня 2011
Dimension d = table.getPreferredSize();
scrollPane.setPreferredSize(
    new Dimension(d.width,table.getRowHeight()*rows+1));

Где rows представляет количество строк данных или ограничение.

6 голосов
/ 29 июня 2011

Я использую setPreferredScrollableViewportSize() в этом контексте, а затем pack() или revalidate(), как требуется.

Добавление:

Как вы это используете?

Это особенность реализации Scrollable в JTable. Вот несколько примеров . Дополнительный getPreferredScrollableViewportSize() также может быть полезен.

3 голосов
/ 26 октября 2017

Следующий (в настоящее время принятый) код не учитывает различные аспекты внешнего вида:

Dimension d = table.getPreferredSize();
scrollPane.setPreferredSize(
    new Dimension( d.width, table.getRowHeight() * (rows+1) ));
  1. Строка заголовка не обязательно table.getRowHeight() пикселей по высоте. (В «Металле» L & F он выше)
  2. Вертикальная полоса прокрутки в scrollPane приведет к тому, что стол будет меньше нужного размера.
  3. Горизонтальная полоса прокрутки займет дополнительное пространство, поэтому не все запрошенные rows строки будут видны.

Вместо этого следует использовать следующий код:

table.setPreferredScrollableViewportSize(
    new Dimension(
        table.getPreferredSize().width,
        table.getRowHeight() * visible_rows));

scrollPane запросит у таблицы предпочтительный размер и добавит к этому дополнительное пространство для заголовка и полос прокрутки.

Ниже показана разница в JTable с 4 строками, когда visible_rows уменьшено с 4 до 3. Предпочтительная ширина JScrollPane автоматически дополняется, чтобы включить полосу прокрутки вместо сжатия столбцов таблицы. Также обратите внимание на место для заголовка (которое отличается от высоты строки), также предоставляется автоматически; он не включен в число visible_rows.

JTable with and without scrollbar

2 голосов
/ 29 июня 2011

Используйте менеджер GridBagLayout и установите максимальный размер JScrollPane на то, что вы хотите. Если таблица больше, JScroll не вырастет за пределы этого размера.

Затем добавьте связующий компонент (я думаю, это что-то вроде BoxLayout.createVerticalGlue или что-то в этом роде), который является пустым компонентом, который просто занимает оставшееся пространство.

Таким образом, когда таблица меньше, этот компонент будет занимать оставшееся пространство, если таблица больше, она ничего не займет, так как JScrollPane использует ее.

0 голосов
/ 22 мая 2017

Если вы используете MigLayout, при добавлении области прокрутки, содержащей JTable, вы можете указать ограничение growx вместо grow, чтобы растянуть его только по горизонтали.

Теперь область прокрутки расположена всередина его родителя.Вы можете установить ограничение строки, чтобы оно выровнялось по top строки.Или в ограничении компонента: aligny top.

...