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

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);



  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值