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