2010-06-24 7 views
0

Ceci est bien connu autoresizer pour JTable: estJTable autoresize, avec une torsion?

public JTable autoResizeColWidth(JTable table, DefaultTableModel model) { 
     table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); 
     table.setModel(model); 

     int margin = 5; 

     for (int i = 0; i < table.getColumnCount(); i++) { 
      int      vColIndex = i; 
      DefaultTableColumnModel colModel = (DefaultTableColumnModel) table.getColumnModel(); 
      TableColumn    col  = colModel.getColumn(vColIndex); 
      int      width  = 0; 

      // Get width of column header 
      TableCellRenderer renderer = col.getHeaderRenderer(); 

      if (renderer == null) { 
       renderer = table.getTableHeader().getDefaultRenderer(); 
      } 

      Component comp = renderer.getTableCellRendererComponent(table, col.getHeaderValue(), false, false, 0, 0); 

      width = comp.getPreferredSize().width; 

      // Get maximum width of column data 
      for (int r = 0; r < table.getRowCount(); r++) { 
       renderer = table.getCellRenderer(r, vColIndex); 
       comp  = renderer.getTableCellRendererComponent(table, table.getValueAt(r, vColIndex), false, false, 
         r, vColIndex); 
       width = Math.max(width, comp.getPreferredSize().width); 
      } 

      // Add margin 
      width += 2 * margin; 

      // Set the width 
      col.setPreferredWidth(width); 
     } 

     ((DefaultTableCellRenderer) table.getTableHeader().getDefaultRenderer()).setHorizontalAlignment(
      SwingConstants.LEFT); 

     // table.setAutoCreateRowSorter(true); 
     table.getTableHeader().setReorderingAllowed(false); 

     return table; 
    } 

Le problème ici que la table retournée se rétrécit (en largeur)

Donc, si mon composant JTable est de 100%, la zone de colonne retournée ne peut être 70% (disons)

Et si je veux l'autoresize, en gardant à l'esprit la largeur d'ensemble d'origine de la JTable dans son ensemble. Donc, même après redimensionnement, toutes les colonnes s'intègrent correctement.

Répondre

1

J'ai réussi à améliorer le code ci-dessus afin de tenir compte de la taille de la table:

public static void resizeTable(JTable table) { 
    int margin = 5; 
    int tableWidth = 0; 
    for (int i = 0; i < table.getColumnCount(); i++) { 
     int vColIndex = i; 
     TableColumn col = table.getColumnModel().getColumn(vColIndex); 
     int width = 0; 
     // Get width of column header 
     TableCellRenderer renderer = col.getHeaderRenderer(); 
     if (renderer == null) { 
      renderer = table.getTableHeader().getDefaultRenderer(); 
     } 
     Component comp = renderer.getTableCellRendererComponent(table, col.getHeaderValue(), false, false, 0, 0); 
     width = comp.getPreferredSize().width; 
     // Get maximum width of column data 
     for (int r = 0; r < table.getRowCount(); r++) { 
      renderer = table.getCellRenderer(r, vColIndex); 
      comp = renderer.getTableCellRendererComponent(table, table.getValueAt(r, vColIndex), false, false, 
        r, vColIndex); 
      width = Math.max(width, comp.getPreferredSize().width); 
     } 
     // Add margin 
     width += 2 * margin; 
     // Set the width 
     col.setPreferredWidth(width); 
     tableWidth += width; 
    } 

    if (tableWidth < table.getParent().getWidth()) { 
     tableWidth = table.getParent().getWidth(); 
     for (int i = 0; i < table.getColumnCount(); i++) { 
      int vColIndex = i; 
      TableColumn col = table.getColumnModel().getColumn(vColIndex); 
      int width = 0; 
      // Get width of column header 
      TableCellRenderer renderer = col.getHeaderRenderer(); 
      if (renderer == null) { 
       renderer = table.getTableHeader().getDefaultRenderer(); 
      } 
      Component comp = renderer.getTableCellRendererComponent(table, col.getHeaderValue(), false, false, 0, 0); 
      width = comp.getPreferredSize().width; 
      // Get maximum width of column data 
      for (int r = 0; r < table.getRowCount(); r++) { 
       renderer = table.getCellRenderer(r, vColIndex); 
       comp = renderer.getTableCellRendererComponent(table, table.getValueAt(r, vColIndex), false, false, 
         r, vColIndex); 
       width = Math.max(width, comp.getPreferredSize().width); 
      } 
      // Add margin 
      width += 2 * margin; 

      // Set the width based on table width 
      if (width < tableWidth/(table.getColumnCount() - i)) { 
       width = tableWidth/(table.getColumnCount() - i); 
      } 
      tableWidth -= width; 
      col.setPreferredWidth(width); 
     } 
    } 
} 

Notez que la boucle dans les données de table est exécutée deux fois. Aussi, je préfère que la fonction soit indépendante de l'instance JTable pour pouvoir l'appeler à partir de n'importe quelle JTable dans mes projets.