1.要想实现JTable宽度自适应,必须首先调用setAutoResizeMode方法,将JTable的自适应模适修改为JTable.AUTO_RESIZE_OFF,默认为JTable.AUTO_RESIZE_SUBSEQUENT_COLUMNS。
在设置此方法前,需要先比较如果表格当前的实际大小并没有达到父容器的宽度,则将其设置为AUTO_RESIZE_SUBSEQUENT_COLUMNS使表格充满父容器,这样更好看些。如果超过了父容器的宽度,则设置为JTable.AUTO_RESIZE_OFF,用自已实际计算的宽度进行设置。因些,在这儿需要比较表格的实际大小与父容器的实际大小再进行设置。


2.宽度自适应需要考虑到表头和表格列数据的实际宽度,对每一列的实际宽度做比较,包括表头,取其中最大值,并设置其值为比较后的最大值。注意,需要调用table().getColumnModel().getColumn(j).setPreferredWidth(max)而不是setWidth方法。


3.一般我们在程序使用过程中都会把JTable加到一个JScrollPane中,以便使JTable实现滚动功能。因此,当我们要达到自适应时,将表格自适应属性设置为JTable.AUTO_RESIZE_OFF后,需要为父容器填加ComponentListener,并实现componentResized方法,在该方法中对表格的宽度进行自适应设置。


4.具体代码如下:

此方法用于设置jtable的列宽与显示内容自适应

public static void fitTableColumns(JTable myTable)
    {
      myTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
         int columnCount = myTable.getColumnCount();
         int rowCount = myTable.getRowCount();
        
         int totalWidth = 0;
         for( int col = 0;col<columnCount;col++){
          int width = myTable.getColumnModel().getColumn(col).getPreferredWidth();
          for( int row = 0; row<rowCount;row++){

                Object value = myTable.getValueAt(row, col);

            Component c = myTable.getCellRenderer(row,col).getTableCellRendererComponent(myTable, value, false, false, row, col);
           int preferedWidth = (int)c.getPreferredSize().getWidth();
            width = Math.max(width, preferedWidth);
          }
          TableColumn column = myTable.getColumnModel().getColumn(col);
          myTable.getTableHeader().setResizingColumn(column); // 此行很重要
             column.setWidth(width+myTable.getIntercellSpacing().width*2);
             totalWidth += width+myTable.getIntercellSpacing().width*2;
         }
         if( myTable.getParent() == null ){
          return;
         }
        //如果表格实际宽度小于父容器的宽度,则让表格自适应
   if( totalWidth < myTable.getParent().getPreferredSize().width){
    myTable.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
   }
   return;
    }

 

JXL导出EXCEL:如何自动调整列宽

获取字符串长度,然后再设置setColumnView,
byte[] bstrLength = rs.getString(j).getBytes(); //中文字符算两个字节
sheet.setColumnView(j-1, bstrLength.length+2);

 

 

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐