Spesso, quando si utilizzano le scritture di utente JTable
o JTree
e assegnarlo è il proprio renderer di celle specifico.Difficoltà a comprendere il meccanismo di rendering di swing JTable e JTree
È molto comune ereditare il componente dell'utente da DefaultTableCellRenderer
e implementa il metodo di rendering getTableCellRendererComponent
. Si scopre che DefaultTableCellRenderer
infatti eredita da JLabel, quindi restituisce se stesso (this) quando viene chiamato a super (nel metodo di rendering) e quindi il renderer dell'utente può analogamente restituire se stesso (questo).
E tutto funziona bene.
La mia domanda è come può essere?
Ogni volta che questo metodo viene chiamato dalla tabella, vengono assegnati parametri diversi e l'etichetta di uscita viene modificata come funzione di questi parametri. Se è effettivamente la stessa istanza dell'etichetta - non dovrebbe essere modificato in base all'ultima chiamata a questo metodo? Non significa che tutte le celle della tabella sono infettate composte dalla stessa istanza dell'etichetta, che contiene lo stesso valore (valore dell'ultima chiamata al metodo di rendering)?
Ho cercato sul web, e scavare nel codice di swing, e non poteva trovare alcun atto di clone o costruttore di copia che duplica in realtà l'etichetta di uscita. Non sono riuscito a trovare alcuna prova che (forse) swing usi la riflessione per riattivare il renderer ogni volta da zero.
Ho letto l'oscillazione del tutorial on JTables, e non ci sono riuscito a trovare le prossime righe:
ci si potrebbe aspettare ogni cella di una tabella per essere un componente. Tuttavia, per motivi di prestazioni, le tabelle Swing vengono implementate in modo diverso. Invece, un renderer a cella singola viene generalmente utilizzato per disegnare tutte le celle che contengono lo stesso tipo di dati. Si può pensare al renderer come a un timbro di inchiostro configurabile che la tabella usa per stampare in modo appropriato i dati formattati su ogni cella. Quando l'utente inizia a modificare i dati di una cella, un editor di celle assume la direzione della cella, controllando il comportamento di modifica della cella.
Danno un suggerimento, che in effetti quello che sto dicendo è corretto, ma non spiegano come il suo effettivamente compiuto.
Non riesco a capirlo. Qualcuno di voi?
+1 La metafora dello screenshot è buona. Ho pensato che il più usato fosse un 'francobollo' ma lo screenshot potrebbe essere più chiaro – Robin
Grazie. la metafora certenly fa il trucco :). ora è capito. –