2009-05-03 45 views
7

Esto me está volviendo loco.Cambiar el color de la celda JTable

Sé que, para cambiar el formato de las celdas de la tabla con JTable, tengo que usar mi propio procesador. Pero parece que no puedo implementar esto correctamente.

Esta es mi configuración actual:

public class MyClass 
{ 
    public static void main(String args[]) 
    { 
     JTable myTable = new JTable(10, 10); 
     myTable.setDefaultRenderer ([I dont know what to put here], new CustomRenderer()); 
    } 
} 

class CustomRenderer extends DefaultTableCellRenderer 
{ 
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) 
    { 
     Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 

     // Formatting 
     return c; 
    } 
} 

¿Qué necesito para usar para el primer parámetro de setDefaultRenderer? La API solo dice 'clase'. No tengo idea de qué poner allí.

¿Podría alguien explicar, en los términos más simples, cómo voy a implementar esto? Proporcione un ejemplo de cómo puedo cambiar el formato desde el método main() también.

Respuesta

13

En el primer parámetro para setDefaultRenderer, coloque la clase literal para la clase que desea anular la representación. Es decir, si los datos consisten en todas las cadenas, se puede poner

myTable.setDefaultRenderer(String.class, new CustomRenderer()); 

Si sus datos también se compone de valores con BigDecimal o Integer como clases, usted tiene que invocar este método varias veces para cada tipo de clase (BigDecimal.class o Integer.class en cada caso).

Y, por último, para cambiar el color de fondo que usted hace esto en su procesador:

class CustomRenderer extends DefaultTableCellRenderer 
{ 
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) 
    { 
     Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 
     c.setBackground(new java.awt.Color(255, 72, 72)); 
     return c; 
    } 
} 

Si se escribe un procesador que debe trabajar para todas las clases de una interfaz, que también tendrá que modificar el getColumnClass función de su modelo de mesa y dejar que se devuelva la clase de interfaz para todos los objetos que implementan esta interfaz:

public Class<? extends Object> getColumnClass(int c) { 
    Object object = getValueAt(0, c); 
    if(object == null) { 
     return Object.class; 
    if(getValueAt(0, c) instanceof IColorable) { 
     return ICarPart.class; 
    } else { 
     return getValueAt(0, c).getClass(); 
    } 
} 

Wi que uno puede registrar un procesador para IColorable.class y no necesita registrar un renderizador separado para cada implementación.

+0

Esto no parece funcionar para mí. Lo único que he hecho es invocar el método setDefaultRenderer y crear la clase CustomRenderer. ¿Hay algo más que deba hacer para que esto funcione? –

+2

Lo tengo trabajando usando Object.class en lugar de String.class. Sin embargo, no estoy seguro de por qué esto era necesario, porque todos mis datos eran cadenas. ¡Gracias por su ayuda! –

+0

¿No tengo permiso para cambiar el procesador dentro de un oyente? Quiero volver a formatear la tabla cuando se presiona un botón. –

Cuestiones relacionadas