Prima di tutto, lasciatemi dire che io non utilizzare il DefaultTreeModel. Implemento il mio TreeModel, quindi non posso usare la roba DefaultXXX. Il problema è questo: attraverso alcuni metodi addStuff() che il mio modello definisce, aggiungo i nodi alla struttura dati sottostante. Ho poi notificare gli ascoltatori chiamando treeNodesChanged() all'interno della funzione addStuff() (so che ci sono metodi treeNodesInserted ma è la stessa cosa. Si segnala solo gli ascoltatori con un metodo diverso). Ora, uno degli ascoltatori è una classe statica nella mia forma principale e questo ascoltatore può dire al JTree, che è anche contenuto nel mio modulo principale, per aggiornarsi. Come faccio a dire al JTree di "ricaricare" alcuni o tutti i suoi nodi dal modello?Come posso aggiornare un JTree dopo aver aggiunto alcuni nodi al modello sottostante?
UPDATE: Trovato questo question che sebbene non esattamente la stessa, dà la risposta che voglio.
UPDATE 2: Il mio problema non era come notificare il visualizzatore (il JTree), ma piuttosto in che modo il jtree dovrebbe essere ricaricato dopo la notifica dal modello.
Prima di tutto lasciatemi dire che l'unico modo che conosco per aggiornare un albero per riflettere le modifiche sottostanti, è chiamare l'updateUI(), o riutilizzare il metodo setModel(). In sostanza, il mio problema è questo:
Supponiamo che TreeModelListener sia stato appena notificato (tramite l'API TreeModelListener) che si è verificata una modifica nel modello. Ok, e adesso?
ho questo problema perché il JTree non implementa TreeModelListener. Quindi l'ascoltatore, nella mia situazione, è il contenitore di JTree, o una classe interna che implementa l'ascoltatore, che vive sotto lo stesso contenitore di Jtree.
Quindi supponiamo che io sono un'implementazione TreeModelListener, che vivono felicemente in un JForm con mio fratello JTree. All'improvviso viene chiamato il metodo treeNodesInserted (TreeModelEvent evt). Cosa faccio ora? Se chiamo Jtree.updateUI() dall'interno di me, l'elenco degli ascoltatori del modello genera un'eccezione di concurrentmodification. Posso chiamare qualcos'altro oltre a updateUI?
ho provato un certo numero di cose, ma solo updateUI rinfrescato la JTree. Quindi l'ho fatto al di fuori dell'ascoltatore. Da JForm, chiamo solo il metodo del modello che altera la struttura undrlying, e poi chiamo updateUI. Non viene usato TreeModelListener.
UPDATE3: Ho scoperto che sono stati registrati TreeModelListeners impliciti. In (ascoltatore TreeModelListener) implementazione addTreeModelListener del mio modello ho messo una linea di debug System.out:
System.out.println("listener added: " + listener.getClass().getCanonicalName());
e ho visto questo output di debug proprio quando ho eseguito jTree.setModel (modello):
ascoltatore aggiunto : javax.swing.JTree.TreeModelHandler
ascoltatore ha aggiunto: javax.swing.plaf.basic.BasicTreeUI.Handler
Il Concur rentModificationException è causato dal fatto che una chiamata a jtree.updateUI() registra nuovamente il listener (solo il file plaf, non entrambi) quindi viene generato quando richiamo updateUI all'interno di un ciclo di notifica del listener. L'unico modo ora per aggiornare l'albero è farlo al di fuori di TreeModelListener. Eventuali commenti o idee per una soluzione migliore? Mi sto perdendo qualcosa?
Se hai trovato la tua risposta, è possibile chiudere la questione –
E sarebbe bello pubblicare la soluzione si è utilizzato. – camickr
Poiché la mia modifica ha origine da un metodo in un JForm (che contiene il modello e il Jtree), non ho usato affatto TreeModelListener. Ho appena chiamato addStuff del modello() che inserisce i nodi nella struttura del modello e poi richiamo manualmente updateUI() sulla struttura. Se ho implementato updateUI() in un'implementazione TreeModelListener in JForm, ho ottenuto un'eccezione di modifica simultanea nell'elenco dei listener. Non ho investigato molto e sono sicuro che non è una soluzione elegante, ma al momento sto facendo prototipi e non mi interessa per le implementazioni interne al momento. – Paralife