2013-07-25 2 views
8

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

for(int column = 0; column < gui.testsuiteInfoTable.getColumnCount(); column ++){ 
     int width =0; 
    for (int row = 0; row < gui.testsuiteInfoTable.getRowCount(); row++) { 
     TableCellRenderer renderer = gui.testsuiteInfoTable.getCellRenderer(row, column); 
     Component comp = gui.testsuiteInfoTable.prepareRenderer(renderer, row, column); 
     width = Math.max (comp.getPreferredSize().width, width); 
     System.out.println(width); 
    } 
    TableColumn col = new TableColumn(); 
    col = gui.testsuiteInfoTable.getColumnModel().getColumn(column); 
    System.out.println(width); 
    col.setWidth(width); 
    gui.testsuiteInfoTable.revalidate(); 

    } 
} 

Размеры правильные, я думаю, но столбцы таблицы все имеют одинаковую ширину! Таблица встроена в ScrollPane в GridBagLayout, это проблема? Спасибо за любые предложения.

+2

Посмотрите на [link] (http://tips4java.wordpress.com/2008/11/10/table-column-adjuster/) –

+0

Не работает. –

ответ

9

Если вы можете использовать дополнительную библиотеку, попробуйте Swingx (https://java.net/projects/swingx) Там у вас есть JXTable, с помощью метода «packAll()», что делает именно то, что вы просите

5
col.setWidth(width); 

Читать JTable API и перейдите по ссылке How to Use Tables. В этом учебнике они используют setPreferredWidth(...), чтобы предложить ширину столбца.

Вы также можете проверить Table Column Adjuster, который делает это за вас. Это решение также может принимать во внимание ширину заголовка столбца.

+0

Спасибо. Проблема заключается в том, что вы не добавляете JTable в JScrollPane, тогда setWidth и т. Д. Не работает. –

19

Это все, что вам нужно:

JTable table = new JTable(){ 
    @Override 
     public Component prepareRenderer(TableCellRenderer renderer, int row, int column) { 
      Component component = super.prepareRenderer(renderer, row, column); 
      int rendererWidth = component.getPreferredSize().width; 
      TableColumn tableColumn = getColumnModel().getColumn(column); 
      tableColumn.setPreferredWidth(Math.max(rendererWidth + getIntercellSpacing().width, tableColumn.getPreferredWidth())); 
      return component; 
     } 
    }; 
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); 

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

+0

Это будет работать, но вы получите предупреждение с запросом serialVersionUID, если вы его не добавите. +1. –

+0

Похоже, что после того, как столбец таблицы будет изменен до большего значения, он не сжимается, чтобы соответствовать текущему состоянию столбцов. – lordoku