有一些列比如日期,是固定格式的,如何能这些列自动适应其宽度,设置setMaxWidth、setPreferredWidth太死了。

解决方案 »

  1.   

    import java.awt.BorderLayout;
    import java.util.Random;import javax.swing.JFrame;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import javax.swing.table.JTableHeader;
    import javax.swing.table.TableColumn;
    import javax.swing.table.TableColumnModel;public class TableColumnAutoAdjustDemo
    {
    public static void main(String[] args)
    {
    JTable table = new JTable(3, 5);
    Random random = new Random();
    for (int i = 0; i < 3; i++) {
    for (int j = 0; j < 5; j++) {
    table.setValueAt(getRandomString(random.nextInt(10)), i, j);
    }
    }
    table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
    adjustTableColumnWidths(table);
    JScrollPane sp = new JScrollPane(table); JFrame f = new JFrame("自动调整宽度");
    f.getContentPane().add(sp, BorderLayout.CENTER);
    f.pack();
    f.setLocationRelativeTo(null);
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.setVisible(true);
    }

    private static String getRandomString(int len)
    {
    StringBuffer buf = new StringBuffer();
    for (int i = 0; i < len; i++) {
    buf.append('M');
    }
    return buf.toString();
    } private static void adjustTableColumnWidths(JTable table) 
    {
    JTableHeader header = table.getTableHeader();
    int rowCount = table.getRowCount();
    TableColumnModel cm = table.getColumnModel(); for (int i = 0; i < cm.getColumnCount(); i++) {
    TableColumn column = cm.getColumn(i);
    int width = (int)header.getDefaultRenderer()
        .getTableCellRendererComponent(table, column.getIdentifier()
                        , false, false, -1, i).getPreferredSize().getWidth();
    for(int row = 0; row<rowCount; row++){
    int preferedWidth = (int)table.getCellRenderer(row, i).getTableCellRendererComponent(table,
                    table.getValueAt(row, i), false, false, row, i).getPreferredSize().getWidth();
    width = Math.max(width, preferedWidth);
    }
    column.setPreferredWidth(width+table.getIntercellSpacing().width);
    }

    table.doLayout();
    }
    }
      

  2.   

    楼主你可真够懒的private static void adjustTableColumnWidths(JTable table) 
    {
    JTableHeader header = table.getTableHeader();  //表头
    int rowCount = table.getRowCount();  //表格的行数
    TableColumnModel cm = table.getColumnModel();  //表格的列模型 for (int i = 0; i < cm.getColumnCount(); i++) {  //循环处理每一列
    TableColumn column = cm.getColumn(i);          //第i个列对象
    int width = (int)header.getDefaultRenderer().getTableCellRendererComponent(table, column.getIdentifier(), false, false, -1, i).getPreferredSize().getWidth();  //用表头的绘制器计算第i列表头的宽度
    for(int row = 0; row<rowCount; row++){  //循环处理第i列的每一行,用单元格绘制器计算第i列第row行的单元格宽度
    int preferedWidth = (int)table.getCellRenderer(row, i).getTableCellRendererComponent(table, table.getValueAt(row, i), false, false, row, i).getPreferredSize().getWidth();
    width = Math.max(width, preferedWidth);  //取最大的宽度
    }
    column.setPreferredWidth(width+table.getIntercellSpacing().width);  //设置第i列的首选宽度
    }

    table.doLayout();   //按照刚才设置的宽度重新布局各个列
    }