Domanda

// newbie domanda

Ho un JTable con un renderer di celle quasi quella di base (che i colori della linea in modo diverso). Ho notato che il mio renderer di celle è costantemente in esecuzione per le linee che vengono visualizzate sullo schermo, anche quando non faccio niente con la tavola.

È così che si suppone di essere? Non dovrebbe aver reso ogni cella una volta, e questo è tutto? Come posso farlo smettere, e ricalcolare solo sul cambiamento?

public Component getTableCellRendererComponent(JTable table, Object value,
    boolean isSelected, boolean hasFocus, int row, int column) {

   log.debug("Building cell : " + row + "," + column);

   Component comp = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);

   Filter filter = (Filter)table.getModel().getValueAt(row, Column.CLASSIFICATION.getIndex());
   comp.setBackground(filter.getColor());
   return comp;

  }
È stato utile?

Soluzione

Ho lavorato un molto con JTables contenenti un molto dei dati. Più di quello che il 99,9% dei programmatori Java tipicamente manipolare. C'è una cosa che dovete sapere:. Per impostazione predefinita, non c'è una quantità folle di rifiuti prodotti e una quantità folle di funzionamento tipicamente inutile fatto

Se siete alla ricerca veloce e JTables efficienti, poi c'è il autorevole articolo Sun sul tema:

"Applicazioni Albero di natale, Come creare JTables frequenti aggiornato che ottengono buoni risultati"

Avviso "che funzionano bene" nel titolo, perché per perfs JTable di default sono davvero, davvero male pateticamente:

originale Link (Sole)

collegamento attuale (Oracle)

archiviati versione:

Dopo l'implementazione di due o tre delle tecniche avvertita in tale articolo, noterete sorprendente aumento di velocità nel vostro rendering JTable e noterete che molto spazzatura meno si genera (e quindi delle esigenze GC a calciare in modo meno spesso) .

Altri suggerimenti

In seguito l'offerta di @Steve McLeod, ho iniziato a costruire un codice di esempio con lo stesso problema, e solo allora mi resi conto che all'interno di uno dei miei cellRenderer

@Override
    public Component getTableCellRendererComponent(JTable table, Object value,
            boolean isSelected, boolean hasFocus, int row, int column) {

        log.debug("Building a list for " + row + "," + column);
        setListData(((Vector<String>)value).toArray());     
        setToolTipText("This is a tool tip for " + row + "," + column);

        table.setRowHeight(row, Math.max(1, getPreferredSize().height));
        Filter filter = (Filter)table.getModel().getValueAt(row, Column.CLASSIFICATION_RESULT.getIndex());
        setBackground(filter.getColor());       
        return this;
    }

ho avuto la linea:

table.setRowHeight(row, Math.max(1, getPreferredSize().height));

ed è costantemente cambiato la linea di fila, mentre gli altri motori di rendering nella stessa linea hanno fatto lo stesso ... così sono stati costantemente sparando a vicenda.

Ho notato che modificare l'aspetto di una cella in base al valore di un'altra cella. Se questo rapporto va in entrambe le direzioni - 1 cella aspetto si basa sulla cella 2 e viceversa si potrebbe ottenere un tale problema. Ma in realtà, abbiamo bisogno di un esempio di codice autonomo che riproduce il problema -. Altrimenti possiamo solo sparare nel buio

il renderer cache già il componente reso, quando nulla cambia nulla viene rerendered

Tuttavia, quando il tavolo rileva qualcosa potrebbe avere cambiato sarà richiedere un re-rendering. L'evento che attiva il più è un movimento del mouse.

Quindi sì il suo comportamento normale per un JTable.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top