2012-04-25 29 views
13

Tengo unclasificable configurado para usar una extensión personalizada del AbstractTableModel. Sin embargo, algún comportamiento de esta tabla es lo que esperaba, y me gustaría algunos consejos sobre cómo resolver esto.Clasificación de columnas seleccionables de JTable: ¿Ordena ordena el contenido de las celdas, pero no actualiza el formato de las celdas?

Tengo el JTable configurado para ser clasificable usando:

thisJTable.setAutoCreateRowSorter(true); 

Esto me permite ordenar la tabla haciendo clic en los encabezados de columna como se esperaba.

Sin embargo, me parece que cuando ordeno la tabla haciendo clic en los encabezados de las columnas, el formato (fondo y color de primer plano) de mis filas no se clasifican también.

Había configurado esas filas para que se codificasen según los valores que contienen. Cuando ordeno por encabezado de columna, el formateo en una fila determinada NUMBER permanece igual (aunque el contenido que estaba previamente en esa fila se movió).

El color de la fila se establece reemplazando el prepareRenderer llamada predeterminado para el JTable:

thisTable = new JTable(thisModel){ 

    //Set up custom rendering - Sets background color of row to correct value 
    public Component prepareRenderer(TableCellRenderer renderer, int row, int column) { 
     Component c = super.prepareRenderer(renderer, row, column); 
     CustTableModel thisModel = (CustTableModel) getModel(); 
     c.setBackground(thisModel.getRowBackgroundColor(row)); 
     c.setForeground(thisModel.getRowForeColor(row)); 
     return c; 
    } 
}; 

¿Existe una manera mejor/diferente de abordar esto?

¿Debería estar utilizando un método diferente para hacer mi representación, un método que actualizaría la representación de la tabla JTable en una ordenación?

¿O deseo investigar cómo escribir mi propio método de clasificación?

Solución (Gracias mKorbel!)

pensé que iba a publicar mi solución, ya que tenía que jugar con esto un poco ya que no estaba seguro de si el nuevo índice se pasa al prepareRenderer como bien.

thisTable = new JTable(thisModel){ 

    //Set up custom rendering - Sets background color of row to correct value 
    public Component prepareRenderer(TableCellRenderer renderer, int row, int column) { 

     int viewIdx = row; 
     int modelIdx = convertRowIndexToModel(viewIdx); 
     Component c = super.prepareRenderer(renderer, row, column); 
     CustTableModel thisModel = (CustTableModel) getModel(); 
     c.setBackground(thisModel.getRowBackgroundColor(modelIdx)); 
     c.setForeground(thisModel.getRowForeColor(modelIdx)); 
     return c; 
    } 
}; 
+0

También pueden necesitar asegúrese de que el formato de contenido se aplique a las filas después de actualizar el contenido, pero aún no lo he abordado . Ya estoy sobreescribiendo custTableModel.setValueAt (Object, int, int), así que estaba pensando que tenía muchas opciones allí, pero pensé que debería mencionar eso también. – Panky

+1

su prepareRenderer no hace nada y cumple con CustTableModel thisModel = (CustTableModel) getModel(); quítelo, [Renderer solo trata de formatear, cambiar Color, etc.] (http://stackoverflow.com/search?q=user%3A714968 + prepareRenderer), no para crear JComponent, no hagas eso – mKorbel

+0

@kKorbel No estoy seguro si sigo tu comentario. getRowForeColor y getRowBackgroundColor agregan colores condicionales para la fila, en función del contenido de la fila (por lo tanto, pasan rowIdx). Estoy usando el método super para crear el componente y luego simplemente establezco el fondo correcto y el color de primer plano en ese componente. Necesito obtener TableModel y convertirlo a mi CustTableModel porque getRow [Fore | Background] Color no es un método definido para otros modelos de tablas. – Panky

Respuesta

13

tienes que convert row index from View to the Model

int modelRow = convertRowIndexToModel(row); 
+2

maldita sea, me ganaste (aún luchando con mi nuevo teclado :-) +1, por supuesto – kleopatra

+0

¡Impresionante! Gracias por la sugerencia, había estado mirando el Javadoc para JTable por un tiempo, pero no tropecé con esto de alguna manera. – Panky

+2

@Panky: "Cuando utilice un clasificador, recuerde siempre traducir las coordenadas de la celda." - [Clasificación y filtrado] (http://docs.oracle.com/javase/tutorial/uiswing/components/table.html#sorting); tristemente, he tenido que buscarlo más de una vez. :-) – trashgod

Cuestiones relacionadas