2011-04-28 29 views
11

Tengo una JTable que tendrá el campo de datos de la última columna cambiar a diferentes valores de cadena. Quiero cambiar el tamaño de la columna a la longitud de la cadena. ¿Cuál es la fórmula para la longitud de la cuerda al ancho?¿Cómo cambiar el tamaño de la columna JTable a la longitud de la cadena?

Voy a utilizar JTable.getColumnModel().getColumn().setPreferredWidth(), así que quiero saber cómo traducir la longitud de la cadena al valor del ancho.

Respuesta

15

usted no está realmente interesado en la longitud de cadena (ni su asignación a una fuente concreta/métricas). Le interesa el tamaño preferido del componente rendering que representa el contenido de la celda. Para conseguir eso, bucle a través de todas las filas y consultar el tamaño, algo así como

int width = 0; 
for (row = 0; row < table.getRowCount(); row++) { 
    TableCellRenderer renderer = table.getCellRenderer(row, myColumn); 
    Component comp = table.prepareRenderer(renderer, row, myColumn); 
    width = Math.max (comp.getPreferredSize().width, width); 
} 

O utilice JXTable (en el proyecto SwingX): tiene un paquete de método(), que hace el trabajo para usted :-)

Editar: la razón para preferir el preaparado de la tabla sobre la invocación manual de getXXRendererComponent en el representador es que la tabla podría decorar las propiedades visuales del componente rendering. Si esas decoraciones efectúan el prefSize del componente, una configuración manual está desactivada.

+0

tableColumn.getWidth() = tableColumn.getPreferredWidth() - la antigua propiedad es! el ancho real, mientras que el último es lo que las columnas quieren obtener. Según el autoResizeMode de JTable, las columnas se comprimen/extienden para ajustarse a la ventana gráfica. Pruebe table.setAutoResizeMode (JTable.AUTO_RESIZE_OFF). Lo más probable es que esto muestre una barra de desplazamiento (la tabla está en un JScrollPane, ¿verdad?) Y el ancho de la columna es el mismo que su prefWidth – kleopatra

+0

. Excelente respuesta, recién estaba implementando esta lógica con la longitud de cadena cuando encontré esta pregunta. ¿Pero también tienes una idea de cómo considerar la longitud del nombre de la columna? –

+0

Bien, acabo de descubrir que hay un método 'getHeaderRenderer()' –

5

Este método paquete de una columna dada en un JTable -

/** 
* Sets the preferred width of the visible column specified by vColIndex. The column 
* will be just wide enough to show the column head and the widest cell in the column. 
* margin pixels are added to the left and right 
* (resulting in an additional width of 2*margin pixels). 
*/ 
public static void packColumn(JTable table, int vColIndex, int margin) { 
    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(); 
    } 
    java.awt.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); 
} 
+0

ser perezoso: JTable tiene un método prepareRenderer - vamos a hacer que es un trabajo en lugar de preparar manualmente – kleopatra

+0

1 para la inclusión de cabeceras en la determinación de la anchura de la columna – amaidment

4

Table Column Adjuster funciona tanto estática como dinámicamente y el usuario puede controlar esto.

+0

solo para enfatizar, repitiendo mi comentario de arriba: ser flojo: JTable tiene un método prepareRenderer - deja que sea su trabajo en lugar de preparar manualmente – kleopatra

+0

@kleopatra, Gracias por señalar eso a Jeanette. Usualmente soy flojo. Otras publicaciones en mi blog usan este método. No estoy seguro de por qué no usé el método prepareRender() esta vez :) – camickr

Cuestiones relacionadas