2012-04-25 15 views
13

Possiedo un ordinabile JTable impostato per utilizzare un'estensione personalizzata di AbstractTableModel. Tuttavia, un comportamento di questo tavolo è quello che mi aspettavo, e mi piacerebbe qualche consiglio su come capirlo.Ordinamento colonna selezionabile JTable: l'ordinamento ordina il contenuto delle celle, ma non aggiorna la formattazione delle celle?

Ho la JTable impostato per essere ordinabili utilizzando:

thisJTable.setAutoCreateRowSorter(true); 

Questo mi permette di ordinare la tabella cliccando sulle intestazioni delle colonne come previsto.

Tuttavia, quando seleziono la tabella facendo clic sulle intestazioni delle colonne, la formattazione (colore di sfondo e di primo piano) delle mie righe non viene ordinata.

Avevo impostato quelle righe per essere codificate a colori in base ai valori che contengono. Quando eseguo l'ordinamento per intestazione di colonna, la formattazione su una determinata riga NUMBER rimane la stessa (anche se il contenuto precedente a quella riga è stato spostato).

Il colore della riga è impostata sovrascrivendo la chiamata di default prepareRenderer per il 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; 
    } 
}; 

Esiste un/diverso modo migliore per avvicinarsi a questo?

Dovrei utilizzare un metodo diverso per eseguire il rendering, un metodo che aggiornerebbe il rendering di JTable su un ordinamento?

Oppure desidero esaminare la scrittura del mio metodo di ordinamento?

Solution (Grazie mKorbel!)

ho pensato di postare la mia soluzione, dal momento che ho dovuto giocare con questo un po 'perché non ero sicuro se il nuovo indice sarebbe passato al prepareRenderer come bene.

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

Ho anche potrebbe essere necessario assicurati che il formmatting basato sul contenuto sia applicato alle righe dopo che il contenuto è stato aggiornato, ma non l'ho ancora affrontato . Sto già sovrascrivendo custTableModel.setValueAt (Object, int, int) quindi pensavo di avere molte opzioni lì, ma ho pensato di doverlo menzionare anche io. – Panky

+1

your prepareRenderer non fa nulla e si complimenta con CustTableModel thisModel = (CustTableModel) getModel() ;, rimuovi che, [Renderer riguarda solo la formattazione, cambia Colore, ecc.] (Http://stackoverflow.com/search?q=user%3A714968 + prepareRenderer), non per creare JComponent, non farlo – mKorbel

+0

@kKorbel Non sono sicuro di seguire il tuo commento. getRowForeColor e getRowBackgroundColor aggiungono colorazione condizionale per la riga, in base al contenuto della riga (quindi passando a rowIdx). Sto usando il metodo super per creare il componente e quindi semplicemente impostando lo sfondo corretto e il colore di primo piano su quel componente. Ho bisogno di ottenere il TableModel e trasmetterlo al mio CustestableModel perché getRow [Fore | Background] Color non è un metodo definito per altri modelli di tabelle. – Panky

risposta

13

bisogna convert row index from View to the Model

int modelRow = convertRowIndexToModel(row); 
+2

maledizione, mi hai battuto (combatto ancora con la mia nuova tastiera :-) +1, ovviamente – kleopatra

+0

Fantastico! Grazie per il suggerimento, ho cercato il Javadoc per JTable per un po ', ma in qualche modo non mi sono imbattuto in questo. – Panky

+2

@Panky: "Quando si utilizza un sorter, ricordarsi sempre di tradurre le coordinate della cella." - [Ordinamento e filtro] (http://docs.oracle.com/javase/tutorial/uiswing/components/table.html#sorting); purtroppo, ho dovuto cercarlo più di una volta. :-) – trashgod

Problemi correlati