JTable預設情況下,列寬是固定值,如下:
若要根據內容來調整列寬,那首先要知道內容佔用多少寬度,代碼如下
int maxwidth = 0; for (int row=0; row<table.getRowCount(); row++) { TableCellRenderer rend = table.getCellRenderer (row, col); Object value = table.getValueAt (row, col); Component comp = rend.getTableCellRendererComponent (table, value, false, false, row, col); maxwidth = Math.max (comp.getPreferredSize().width, maxwidth); }
這段代碼是在計算資料行內容中的最大值maxwidth,其原理是這樣的
1、通過資料模型TableModel擷取該列某行的值資料
Object value = table.getValueAt (row, col);
2、用渲染方法把值資料轉換成顯示的組件,就是這個方法getTableCellRendererComponent
如果不瞭解MVC模型和JTable的渲染器的話,建議看這篇文章http://blog.csdn.net/mylxiaoyi/article/details/8192998
getTableCellRendererComponent方法應該是jtable調用來把資料模型的資料渲染成component,然後顯示在jtable的儲存格上,所以我們看到的jtable儲存格都是這個方法返回的component
3、現在主動調用getTableCellRendererComponent方法,擷取到要顯示的component,然後getPerferredSize,再篩選出最大值就行
4、最後把篩選出的最大值設定為column的寬度即可
已經是根據內容調整列寬了,但是還有一個缺點就是第一列,只考慮到了列內容的寬度,但是沒有考慮到表頭的內容寬度
不過思路也是一樣的,擷取表頭的資料模型 和 渲染器,然後主動構造出表頭的component擷取PerferredSize,再判斷下列寬值即可
TableCellRenderer headerRenderer = column.getHeaderRenderer(); if (headerRenderer == null) headerRenderer = table.getTableHeader().getDefaultRenderer(); Object headerValue = column.getHeaderValue(); Component headerComp = headerRenderer.getTableCellRendererComponent (table, headerValue, false, false, 0, col); maxwidth = Math.max (maxwidth, headerComp.getPreferredSize().width);