2009-11-23 20 views
15

En una JTable, ¿cómo puedo hacer que algunas filas aumenten automáticamente la altura para mostrar el texto completo de varias líneas en el interior? Esta es la forma en que se visualiza en la actualidadAjuste automático de la altura de las filas en una JTable

no quiero para establecer la altura de todas las filas, pero sólo para los que tienen texto de varias líneas.

Respuesta

32

La única manera de saber la altura de la fila es asegurarse de que cada celda determine la altura representada. Después de la tabla se llena con los datos que puede hacer:

private void updateRowHeights() 
{ 
    for (int row = 0; row < table.getRowCount(); row++) 
    { 
     int rowHeight = table.getRowHeight(); 

     for (int column = 0; column < table.getColumnCount(); column++) 
     { 
      Component comp = table.prepareRenderer(table.getCellRenderer(row, column), row, column); 
      rowHeight = Math.max(rowHeight, comp.getPreferredSize().height); 
     } 

     table.setRowHeight(row, rowHeight); 
    } 
} 

Si sólo la primera columna puede contener varias líneas puede optimizar el código anterior sólo para esa columna.

+1

¿Necesito un modelo de tabla para esto? – Wulf

+0

¿Por qué atrapar ClassCastException? No hay lanzamientos ni operaciones sin marcar. –

+0

@KarlRichter, buen punto, no estoy seguro de por qué está allí. El try/catch ha sido eliminado. – camickr

1

Debe iterar sobre cada fila, obtener el cuadro delimitador para cada elemento y ajustar la altura en consecuencia. No hay soporte de código para esto en la JTable estándar (see this article for a solution para Java ... 1.3.1 = 8 * O).

1

La solución de Camickr no funcionó para mí en absoluto. Sin embargo, mi modelo de datos fue dinámico: cambió todo el tiempo. Supongo que la solución mencionada funciona para datos estáticos, como si provinieran de una matriz.

Tenía JPanel para componente de procesador de celda y su tamaño preferido no se configuró correctamente después de usar prepareRenderer (...). El tamaño se configuró correctamente después de que la ventana contenedora ya estaba visible y se volvió a pintar (2 veces, de hecho, después de un tiempo no especificado, aunque corto). ¿Cómo podría llamar al método updateRowHeights() que se muestra arriba entonces y dónde haría esto? Si lo llamé (reemplazado) Table.paint() obviamente causó infinitos repintados. Me tomó 2 días. Literalmente. La solución que funciona para mí es esta (este es el renderizador de células que utilicé para mi columna):

public class GlasscubesMessagesTableCellRenderer extends MyJPanelComponent implements TableCellRenderer { 

    @Override 
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, 
      int row, int column) { 
     //this method updates GUI components of my JPanel based on the model data 
     updateData(value); 
     //this sets the component's width to the column width (therwise my JPanel would not properly fill the width - I am not sure if you want this) 
     setSize(table.getColumnModel().getColumn(column).getWidth(), (int) getPreferredSize().getHeight()); 

     //I used to have revalidate() call here, but it has proven redundant 

     int height = getHeight(); 
     // the only thing that prevents infinite cell repaints is this 
     // condition 
     if (table.getRowHeight(row) != height){ 
      table.setRowHeight(row, height); 
     } 
     return this; 
    } 
} 
+1

Puede establecer RowHeight dinámicamente como [this] (http://stackoverflow.com/questions/21723025/how-to-set-the-rowheight-dynamically-in-a-jtable). – GAVD

+0

Gracias GAVD. Oh, lo intenté;) Desafortunadamente, los eventos de TableModelListener son eventos del modelo de tabla, no la GUI de la tabla. Son elevados/largos/antes de que la GUI se vuelva a pintar y los componentes de la GUI se calculen correctamente. Puede forzar el cálculo de los tamaños en este punto (no pude resolver esto durante 2 días), pero ¿por qué lo haría? El repintado hará el trabajo de todos modos. Sé que esta solución está sucia, pero después de 2 días, su perfeccionismo disminuye, ya lo sabe;) – ed22

Cuestiones relacionadas