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.youkuaiyun.com/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);
