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);
- }
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);
原文地址:http://blog.csdn.net/pandakong/article/details/8617153