Ответ 1
Dimension d = table.getPreferredSize();
scrollPane.setPreferredSize(
new Dimension(d.width,table.getRowHeight()*rows+1));
Где rows
представляет количество строк данных или предел.
В настоящее время JTables вложен в JScrollPanes следующим образом:
Моя проблема в том, что количество строк в каждой таблице является переменной при создании таблицы. Я хочу сделать JScrollpane меньше, если таблица слишком короткая, но я хочу сохранить ее в заданном размере, если таблица слишком длинная.
Как я могу это сделать?
Dimension d = table.getPreferredSize();
scrollPane.setPreferredSize(
new Dimension(d.width,table.getRowHeight()*rows+1));
Где rows
представляет количество строк данных или предел.
Я использую setPreferredScrollableViewportSize()
в этом контексте, а затем pack()
или revalidate()
по мере необходимости.
Приложение:
Как вы его используете?
Это особенность реализации Scrollable
в JTable
. Вот несколько примеров . Дополнительный getPreferredScrollableViewportSize()
также может быть полезен.
Используйте диспетчер GridBagLayout и установите максимальный размер JScrollPane в соответствии с тем, что вы хотите. Если таблица больше, JScroll не будет расти за этот размер.
Затем добавьте компонент клея (я думаю, что это что-то вроде BoxLayout.createVerticalGlue или что-то в этом роде), который является пустым компонентом, который просто занимает оставшееся пространство.
Итак, когда таблица меньше, этот компонент займет оставшееся пространство, если таблица больше, это не займет ничего, поскольку JScrollPane использует его.
Следующий (принятый в настоящее время) код не учитывает различные аспекты 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
.
Если вы используете MigLayout, добавив прокрутку, содержащую JTable, вы можете указать ограничение growx
вместо grow
, чтобы растянуть его только горизонтально.
Теперь scrollpane находится в середине своего родителя. Вы можете установить ограничение строки, чтобы оно соответствовало строке top
строки. Или в ограничении компонента: aligny top
.