2012-08-28 7 views
5

Sto utilizzando un renderer di celle personalizzato che implementa TableCellRenderer e visualizza JTextArea (anziché JLabel) per ogni riga. In pratica sto sovrascrivendo il metodo getTableCellRendererComponent (...) con il mio che esegue alcuni calcoli aggiuntivi per riga. Questi calcoli devono essere eseguiti solo una volta per aggiornamento della tabella. Poiché il metodo getTableCellRendererComponent viene chiamato con ogni spostamento del mouse, si verifica un ritardo. Quindi ho pensato che dovevo impedire a getTableCellRendererComponent di essere chiamato per evitare il ritardo.Riduci il numero di chiamate getTableCellRendererComponent

Considerazioni:

1) Il mio tavolo ha solo 1 colonna e non ha alcuna intestazione.

2) My dati è statico e viene letto da un ArrayList da getValueAt (int riga, int column) metodo in una classe TableModel personalizzata attuazione AbstractTableModel.

3) Non è necessario controllare gli eventi di movimento del mouse.

4) Non mi aspetto molti dati, quindi potrei voler visualizzare l'intera tabella alla volta o salvarla completamente.

5) La maggior parte del ritardo è causata dall'impostazione del testo ogni volta quando si torna da getTableCellRendererComponent, poiché alcune righe utilizzano caratteri da destra a sinistra e il testo RTL richiede più tempo per il rendering.

+1

solo per sottolineare la risposta di @Robin: mai fare mai _questo calcolo in getXXRendererComponent. La frequenza delle chiamate è elevata e completamente fuori dal tuo controllo. – kleopatra

+0

@kleopatra k capito. Ma come controllo allora le operazioni interne? Come i metodi setText e setFont uso (per la mia cella JTextArea) all'interno del metodo getCellRendererComponent. –

+0

la configurazione di _renderer_ va bene .. sembra che io stia fraintendendo ciò che intendi per "calcolo". Tempo per un SSCEE (o per lo meno il codice del renderizzatore :-) – kleopatra

risposta

7

Non cercare di limitare il numero di chiamate getTableCellRendererComponent. Invece, rendi migliore la tua implementazione del renderer memorizzando nella cache i risultati del calcolo.

È possibile aggiungere facilmente un listener a tablemodel in modo che il proprio renderizzatore sappia quando il modello viene aggiornato. Solo allora dovrebbe indicare che i risultati del calcolo memorizzati non sono validi e ricalcolarli alla successiva chiamata getTableCellRendererComponent.

Problemi correlati