您的位置:首页 > 其它

Swinghacks——JTable根据内容调整列宽

2013-02-27 12:59 183 查看
2013-02-27 12:59
477人阅读 评论(0)
收藏
举报
JTable默认情况下,列宽是固定值,如下:



若要根据内容来调整列宽,那首先要知道内容占用多少宽度,代码如下

[java]
view plaincopyprint?

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获取该列某行的值数据

[java]
view plaincopyprint?

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,再判断下列宽值即可

[java]
view plaincopyprint?

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: