2010-03-09 58 views
23

No sé cómo alinear los valores de las celdas en JTable.Alinea los valores de las celdas en JTable?

Para Ex, Los espectáculos JTable, Nombre Salario Mr.X 100.000,50 XXXX 234,34 aaaa 1205,50

quiero alinear los "sueldos" en el siguiente formato.

Name  Salary 
    Mr.X  100000.50 
    XXXX   234.34 
    YYYy  1205.50 

Cómo alinear como por encima de la JTable

Respuesta

42

No hay necesidad de crear una clase personalizada para esto, sólo tiene que utilizar el procesador predeterminado:

DefaultTableCellRenderer rightRenderer = new DefaultTableCellRenderer(); 
rightRenderer.setHorizontalAlignment(SwingConstants.RIGHT); 
table.getColumnModel().getColumn(???).setCellRenderer(rightRenderer); 

O un mejor enfoque es el de guardar los valores dobles en la tabla a continuación, un procesador numérico adecuado será los procesadores usados ​​y los números se alinean automáticamente a la derecha. A continuación, puede personalizar el formato del número usando Table Format Renderer.

+0

y cómo puedo alinear a la derecha durante la edición? – pts

+0

El nombre de la constante correcta es 'DefaultTableCellRenderer.RIGHT', mira la publicación de @Adrián en este hilo.(O 'SwingConstats.RIGHT'). – xmedeko

0

La forma de hacerlo es especificar una costumbre cell renderer para cada columna. Cada procesador dará formato a los datos de forma diferente (E nombres serán alineados a la izquierda, decimales a la derecha, ...)

4

De this forum post:

Crear una clase que se extiende DefaultTableCellRenderer y poner en práctica el método getTableCellRendererComponent(), algo así como :

public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) 
{ 
    JLabel renderedLabel = (JLabel) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 
    renderedLabel.setHorizontalAlignment(SwingConstant s.RIGHT); 
    return renderedLabel; 
} 

e instale este representador para la columna en cuestión.

Ahora solo necesita asegurarse de que cada valor tenga el mismo número de decimales porque para la mayoría de las fuentes, todos los dígitos tienen el mismo ancho.

3

Tengo un método que se alinea una columna en una tabla de la derecha:

private void alignRight(JTable table, int column) { 
    DefaultTableCellRenderer rightRenderer = new DefaultTableCellRenderer(); 
    rightRenderer.setHorizontalAlignment(JLabel.RIGHT); 
    table.getColumnModel().getColumn(column).setCellRenderer(rightRenderer); 
} 
8

Tenemos que hacer una pequeña corrección, de la manera correcta es DefaultTableCellRenderer.RIGHT

DefaultTableCellRenderer rightRenderer = new DefaultTableCellRenderer(); 
rightRenderer.setHorizontalAlignment(DefaultTableCellRenderer.RIGHT); 
tableExample.getColumn("Price").setCellRenderer(rightRenderer); 

Observe la diferencia con la respuesta original de camickr, "Precio" es el nombre de la columna, cambie según el caso.

+1

RIGHT se define realmente en la interfaz SwingConstants (que JLabel y DefaultTableCellRenderer implementan/heredan). Entonces, cualquiera de estos prefijos le da un valor para DERECHO ... pero para mayor claridad, ¿por qué no usar SwingConstants.RIGHT? O si cree que quiere estar absolutamente seguro de que tiene el "DERECHO" que pertenece al renderizador en cuestión, podría usar el derechoRenderer.RIGHT. – gwideman

+2

'SwingConstants.RIGHT' es la constante adecuada. –

+1

De hecho, cuando se utiliza 'DefaultTableCellRenderer.RIGHT', Eclipse da una advertencia _" El campo estático SwingConstants.RIGHT debe ser accedido directamente "_ –

4

Una forma sencilla está utilizando DefaultTableModel y anulación método getColumnClass()
Ex:

DefaultTableModel model = new DefaultTableModel() { 
     @Override 
     public Class getColumnClass(int columnIndex) { 
      if (columnIndex == 0) { 
       return Integer.class; 
      } else { 
       return String.class; 
      } 
     } 
    }; 

Si devuelve enteros, su columna se alineará anh derecho si el retorno de cuerdas de su columna se alineará izquierda.

0

como para más de una tabla a la vez me las arreglé para hacer esto ... es como @camickr publicado pero añade las cabeceras demasiado

DefaultTableCellRenderer rightRenderer_c = new DefaultTableCellRenderer(); 
    DefaultTableCellRenderer rightRenderer_h = new DefaultTableCellRenderer(); 
    rightRenderer_c.setHorizontalAlignment(javax.swing.JLabel.RIGHT); 

    for(JTable t : Tables){ //Tables is an ArrayList<JTable> 

     //for the headers : 
     rightRenderer_h = (DefaultTableCellRenderer) t.getTableHeader().getDefaultRenderer(); 
     rightRenderer_h.setHorizontalAlignment(javax.swing.JLabel.RIGHT); 

     //for cells : 
     for(int i=0; i < t.getColumnCount(); i++){ 
      t.getColumnModel().getColumn(i).setCellRenderer(rightRenderer_c); 
     } 
    } 
Cuestiones relacionadas