JTable默认情况下列宽是固定值如下 若要根据内容来调整列宽那首先要知道内容占用多少宽度代码如下 [java] int maxwidth = ; for (int row=; row<tablegetRowCount(); row++) { TableCellRenderer rend = tablegetCellRenderer (row col); Object value = tablegetValueAt (row col); Component comp = rendgetTableCellRendererComponent (table value false false row col); maxwidth = Mathmax (compgetPreferredSize()width maxwidth); } 这段代码是在计算列内容中的最大值maxwidth其原理是这样的 通过数据模型TableModel获取该列某行的值数据 [java] Object value = tablegetValueAt (row col); 用渲染方法把值数据转换成显示的组件就是这个方法getTableCellRendererComponent 如果不了解MVC模型和JTable的渲染器的话建议看这篇文章 getTableCellRendererComponent方法应该是jtable调用来把数据模型的数据渲染成component然后显示在jtable的单元格上所以我们看到的jtable单元格都是这个方法返回的component 现在主动调用getTableCellRendererComponent方法获取到要显示的component然后getPerferredSize再筛选出最大值就行 最后把筛选出的最大值设置为column的宽度即可 上图已经是根据内容调整列宽了但是还有一个缺点就是第一列只考虑到了列内容的宽度但是没有考虑到表头的内容宽度 不过思路也是一样的获取表头的数据模型 和 渲染器然后主动构造出表头的component获取PerferredSize再判断下列宽值即可 [java] TableCellRenderer headerRenderer = columngetHeaderRenderer(); if (headerRenderer == null) headerRenderer = tablegetTableHeader()getDefaultRenderer(); Object headerValue = columngetHeaderValue(); Component headerComp = headerRenderergetTableCellRendererComponent (table headerValue false false
col); maxwidth = Mathmax (maxwidth headerCompgetPreferredSize()width); |