Сократите панель JScroll до той же высоты, что и JTable


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

Введите описание изображения здесь

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

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

5 16

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) ));
  1. строка заголовка не обязательно имеет высоту table.getRowHeight() пикселей. (В "металлическом" L&F он выше)
  2. Вертикальная полоса прокрутки в scrollPane будет сжимать таблицу меньше, чем ее предпочтительный размер. Горизонтальная полоса прокрутки будет занимать дополнительное пространство, поэтому не все запрошенные строки rows будут видны.

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

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

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

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

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