2011-07-28 25 views
8

Tengo una JTable basculante básica y el requisito es que cuando se hace clic en una celda, se resalte toda la fila y también que la celda en la que se hizo clic tenga un color diferente al resto de la fila resaltada.Swing JTable - Resalta la celda seleccionada en un color diferente del resto de la fila seleccionada?

Actualmente, tengo isRowSelectionAllowed como cierto

He intentado utilizar una costumbre TableCellRenderer es el siguiente:

public class CustomTableCellRenderer extends DefaultTableCellRenderer 
{ 

public static final DefaultTableCellRenderer DEFAULT_RENDERER = new DefaultTableCellRenderer(); 
    @Override 
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { 
    Component c = DEFAULT_RENDERER.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 

    if (isSelected) { 
     c.setBackground(Color.red); 
    } 
    else { 
     c.setForeground(Color.black); 
     c.setBackground(Color.white); 
    } 
    return c; 
    }  
} 

Pero eso no parece funcionar (fila entera estaba resaltado en rojo).

También probé establecer la propiedad UIManager de la siguiente manera:

UIManager.put("Table.focusCellBackground", 
     new javax.swing.plaf.ColorUIResource (Color.red)); 

Pero eso no parece funcionar bien (a pesar de que, cuando traté de establecer una frontera usando

UIManager.put("Table.focusCellHighlightBorder", 
     new BorderUIResource.LineBorderUIResource(Color.red)); 

que funcionaba bien)

¿Podría darme alguna sugerencia sobre lo que podría necesitar hacer?

Respuesta

10

Prueba esto:

jtable.setCellSelectionEnabled(true); 

Luego, en el getTableCellRendererComponent

if (table.isCellSelected(row, column)) 
    setForeground(Color.red); 
else if (table.isRowSelected(row)) 
    setForeground(Color.green); 
else if (table.isColumnSelected(column)) 
    setForeground(Color.blue); 
else 
    setForeground(Color.black); 

Eso hará que la celda seleccionada en rojo, el resto de la fila en verde, y el resto de la columna en azul . Nota: la selección de celda requiere que el modelo de selección sea único, otros modelos de selección pueden causar comportamientos impredecibles.

+0

Intenté esto, pero no cambia el color en absoluto. Entra en la condición if para 'isCellSelected' y' isRowSelected', pero no parece estar haciendo nada. –

+0

Lo siento, mi error - Lo intenté, y esto funciona. Muchas gracias. (Estableciendo esto como la respuesta aceptada debido al código de trabajo. Otras respuestas fueron útiles para aprender también). –

3

Debería desactivar la selección de fila y seleccionar la celda para la tabla. Luego, encuentre una forma de regresar y resaltar la fila si es necesario.

+0

¿Quiere decir que activo CellSelectionEnabled (true) y luego manejo una selección de fila usando algo como esto? table.changeSelection (row, col, toggle, extend); ? De alguna manera está dando el mismo resultado. –

+0

Sí, a la primera parte, no a la segunda. Necesitará un procesador de celda que resalte la fila seleccionada en un color diferente al de la celda seleccionada. – jzd

+0

Lo intentaré y le haré saber. –

4

Pero eso no parecía funcionar (toda la fila estaba resaltada en rojo).

Debe verificar la variable "hasFocus", no la variable "isSelected".

Otra opción en lugar de crear múltiples renderizadores personalizados (en caso de que la tabla tenga columnas de tipos de clases diferentes) es usar el enfoque Table Row Renderering.

Cuestiones relacionadas