2013-07-13 3 views
18

Мне нужно, чтобы JTable автоматически менял размер столбцов в соответствии с содержимым. Я нашел класс TableColumnAdjuster очень полезным. Но есть небольшая проблема. Скажем, у меня 5 столбцов, и их содержание очень короткое. В этом случае, если я использую автоматический регулятор, он устанавливает первые четыре столбца ширины в соответствии с их содержимым и передает все остальное пространство в последний столбец. См. Пример.Автоматическое изменение размеров столбцов JTable

enter image description here

Здесь последний столбец, Balance дается все излишки пространства. Но что, если мне нужно дать это пространство одному из средних столбцов. В приведенном выше случае мне нужно назначить это пространство третьему столбцу, name. Я пробовал модифицировать метод TableColumnAdjuster класса adjustColumns(). Но я не мог заставить его работать.

Я попробовал как column.setPreferredWidth(), так и column.setWidth() для изменения размеров колонок. Но, похоже, это ничего не меняет. Как я могу эффективно изменять размеры столбцов в JTable. Если есть какая-то другая альтернатива или прямой ответ на мою главную проблему, это лучше. Благодаря!

ответ

43

Вы можете попробовать следующее:

public void resizeColumnWidth(JTable table) { 
    final TableColumnModel columnModel = table.getColumnModel(); 
    for (int column = 0; column < table.getColumnCount(); column++) { 
     int width = 15; // Min width 
     for (int row = 0; row < table.getRowCount(); row++) { 
      TableCellRenderer renderer = table.getCellRenderer(row, column); 
      Component comp = table.prepareRenderer(renderer, row, column); 
      width = Math.max(comp.getPreferredSize().width +1 , width); 
     } 
     if(width > 300) 
      width=300; 
     columnModel.getColumn(column).setPreferredWidth(width); 
    } 
} 

JTable

Это должно быть выполнено перед использованием способа изменения размера.
Если у вас есть:

table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); 

JTable

+0

Это фантастика, в конечном итоге ее использование. Я добавил проверку перед вызовом setPreferredColumnModel, который выглядит как «if (width> 300) width = 300;» который фиксирует некоторые случаи, когда я показываю действительно длинные поля данных. Я бы предложил добавить это к ответу - и вы могли бы также извлечь min/max width (Сделали бы фантастические дополнительные параметры - на самом деле я собираюсь сделать это в своей кодовой базе сейчас.) (Хотел бы я знать когда было здорово редактировать что-то подобное в чужом ответе ...Поскольку это не CW, я ненавижу изменять контент без разрешения.) –

+0

Привет, @BillK Не стесняйтесь редактировать/добавлять код ... и если у вас есть скриншот. ;) –

+0

Могу ли я также каким-то образом оценить заголовок, чтобы его текст не обрезался? – Xerus

5

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

Может быть, вы можете что-то вроде:

tca = new TableColumnAdjuster(table, 0); 
tca.adjustColumns(); 
TableColumnModel tcm = table.getColumnModel(); 
TableColumn tc = tcm.getColumn(1); 
tc.setWidth(tc.getWidth() + 25); 

Это позволит вам добавить дополнительное пространство в колонну 1. Это дополнительное пространство будет добавлен только в первый раз, отображается в таблице.

Другой вариант заключается в использовании:

table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS); 

Это будет выделять дополнительное пространство пропорционально каждой колонке.

0

Вы можете сделать это:

JPanel jp = new JPanel(); 
jp.add(table); 

jp.setLayout(new GridLayout(1,1)); /* little trick ;) and believe me that this step is important to the automatic all columns resize! A import is also needed for using GridLayout*/ 
table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS); // this is obvius part 
+0

не работает ...... – Augusto

1

setAutoResizeMode() покажет таблицу, как изменить размер, вы должны дать ему попробовать будет все различные варианты, чтобы увидеть различия, в моем случае, я хотел в частности, изменить размер двух столбцов и позволить ему решить, как настроить все остальные.

jTable1.setAutoResizeMode(JTable.AUTO_RESIZE_NEXT_COLUMN); 
TableColumnModel colModel=jTable1.getColumnModel(); 
colModel.getColumn(1).setPreferredWidth(25);  
colModel.getColumn(2).setPreferredWidth(400); 
Смежные вопросы