Подтвердить что ты не робот

Термоусадочная панель JScroll с той же высотой, что и JTable

В настоящее время JTables вложен в JScrollPanes следующим образом:

enter image description here

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

Как я могу это сделать?

4b9b3361

Ответ 1

Dimension d = table.getPreferredSize();
scrollPane.setPreferredSize(
    new Dimension(d.width,table.getRowHeight()*rows+1));

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

Ответ 2

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

Приложение:

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

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

Ответ 3

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

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

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

Ответ 4

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

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

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

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

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

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

JTable с и без полосы прокрутки

Ответ 5

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

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