2011-10-16 8 views
7

Tengo una JTable con varias columnas. Quiero una columna en particular para cambiar el tamaño. Lo que esperaba era usar setPreferredWidth, la columna cambiaría el tamaño a ese tamaño, o el tamaño de los contenidos de modo que no se produjera el truncado y dejara que el resto de las columnas ocupen el espacio restante, pero en su lugar, todas las columnas, incluyendo el que cambié de tamaño, divide por igual todo el espacio de la mesa; como si setPreferredWidth hiciera nada en absoluto. En efecto, quiero poder establecer el ancho de una columna y hacer que se reduzca a ese tamaño sin truncar el contenido (¿he insistido demasiado en eso?) De modo que todas las columnas que no se han redimensionado se hayan llenado el espacio restante. El uso de setMaxWidth trunca el contenido (¿mencioné que no me gustó eso?) ¿Cómo puedo redimensionar/reducir una columna sin que trunque y sin hacerlo absolutamente nada? Aquí está el código erróneo:TableColumn setPreferredWidth no funciona

for (int i = 0, x = 0; i < table.getColumnModel().getColumnCount(); i++) 
    if ((x = model.getColumnWidth(i)) > -1) 
     table.getColumnModel().getColumn(i).setPreferredWidth(x); 

La tabla está en un JPanel (MyListPanel - BorderLayout), que se encuentra en otro JPanel (GridBagLayout) que se añade con:

new GridBagConstraints(0, 3, 1, 1, 1.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(2, 0, 0, 2), 0, 0)) 

EDIT: Este es el constructor de mi subclase de JPanel:

public MyListPanel(boolean showHeader, String title, ColData...columns) { 
    super(new BorderLayout()); 
    model = new MyListTableModel(columns); 
    table = new JTable(model); 

    table.addFocusListener(this); 

    add(table); 
    table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); 

    setTitle(title); 

    if (showHeader) 
     add(table.getTableHeader(), BorderLayout.NORTH); 

    for (int i = 0, x = 0; i < table.getColumnModel().getColumnCount(); i++) 
     if ((x = model.getColumnWidth(i)) > -1) 
      table.getColumnModel().getColumn(i).setPreferredWidth(x); 

    setBorder(BorderFactory.createEtchedBorder(EtchedBorder.LOWERED)); 
} 

Y MyListTableModel.ColData:

public static class ColData { 
    private int index; 
    private String title; 
    private int width; 
    public ColData(int _index, String _title, int _width) { index = _index; title = _title; width = _width; } 
} 

Respuesta

8

incluyen:

table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); 
+0

no hace el truco :( –

2

sé que esto es un poco tarde, así que es sobre todo para los futuros lectores, pero no tenía el mismo problema y lo resolvió mediante el ajuste de anchura preferida y anchura máxima de la columna a el mismo valor

3

Tuve un problema similar a pesar de intentar las otras dos respuestas aquí. En mi caso, algunas veces el ancho se establecería correctamente, mientras que otras veces, no lo haría. Descubrí que el problema fue causado porque estaba tratando de establecer el ancho de las columnas inmediatamente después de cambiar el modelo de mi tabla. Encontré establecer los anchos de las columnas dentro de SwingUtilities.invokeLater() hice el truco. ES DECIR.

SwingUtilities.invokeLater(new Runnable(){ 

    @Override 
    public void run() { 
     int width = 100; 
     for (int column = 1; column < table.getColumnCount(); column++) { 
      columnModel.getColumn(column).setPreferredWidth(width); 
     } 
    } 
} 
+0

Voy a upvote porque esto parece que podría haber fijado mi problema, pero me deja ese trabajo. –

1

Tuve el mismo problema y al leer la respuesta de @Jay Askren, todo lo contrario funcionó para mí. Tuve que establecer el ancho en el método donde se estaba creando la tabla.

public class Example{ 
    //..stuff 
    private JTable myTable; 

    public Example{ 
    //..stuff 
    myTable = AnotherClass.getTable(); 
    myTable .getColumnModel().getColumn(0).setPreferredWidth(100);//not here 
    } 

} 

public class AnotherClass{ 
    public static JTable getTable(){ 
    JTable table= new JTable(); 
    table.setModel(anyModel); 
    table.getColumnModel().getColumn(0).setPreferredWidth(100);//Here! 
    return table 
    } 
}