java - columns - Ajuste automático de la altura de las filas en un JTable
jtable row height (3)
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 el JTable estándar ( consulte este artículo para obtener una solución para Java ... 1.3.1 = 8 * O).
En una tabla J, ¿cómo puedo hacer que algunas filas aumenten automáticamente la altura para mostrar el texto completo de varias líneas en el interior? Así es como se muestra en este momento:
No quiero establecer la altura para todas las filas, sino solo para las que tienen texto de varias líneas.
La única manera de saber la altura de la fila es hacer que cada celda determine la altura representada. Después de que su tabla esté llena de datos, 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 solo la primera columna puede contener varias líneas, puede optimizar el código anterior solo para esa columna.
La solución de Camickr no me funcionó en absoluto. Aunque mi modelo de datos era dinámico, cambiaba todo el tiempo. Supongo que la solución mencionada funciona para datos estáticos, como provenir de una matriz.
Tenía JPanel para el componente procesador de celdas 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 estuviera visible y se repintó (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 en ese momento y dónde haría esto? Si lo llamé en (sobrescritura) Table.paint () obviamente causó repinturas infinitas. Me tomó 2 días. Literalmente. La solución que me funciona es la siguiente (este es el procesador de celdas que usé 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;
}
}