Swinghacks——JTable根據內容調整列寬

來源:互聯網
上載者:User

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.