Domanda

Sto scrivendo un albero Java in cui i nodi dell'albero potrebbero avere figli che impiegano molto tempo per il calcolo (in questo caso, è un file system, dove potrebbero esserci timeout di rete che impediscono di ottenere un elenco di file da un allegato guidare).

Il problema che sto riscontrando è questo:

  1. getChildCount () viene chiamato prima che l'utente richieda specificamente l'apertura di un particolare ramo dell'albero. Credo che ciò avvenga in modo che il JTree sappia se mostrare un'icona + vicino al nodo.

  2. Un conteggio accurato di bambini da getChildCount () dovrebbe eseguire l'operazione potenzialmente costosa

  3. Se fingo il valore di getChildCount () , l'albero alloca spazio solo per quel numero di nodi figlio prima di chiedere un elenco dei figli. (Se ritorno '1', vedrò solo 1 figlio elencato, nonostante ce ne siano altri)

L'enumerazione dei bambini può essere costosa e richiede molto tempo, non ci sto. Ma non sto bene con getChildCount () che deve conoscere il numero esatto di bambini.

In che modo posso aggirare questo?

Aggiunto: L'altro problema è che se uno dei nodi rappresenta un'unità floppy (che arcaica!), l'unità verrà interrogata prima che l'utente richieda i suoi file; se non è presente alcun disco nell'unità, si verifica un errore di sistema.

Aggiornamento: Sfortunatamente, l'implementazione del listener TreeWillExpand non è la soluzione. Ciò può consentire di porre il veto a un'espansione, ma il numero di nodi visualizzati è ancora limitato dal valore restituito da TreeNode.getChildCount () .

È stato utile?

Soluzione 4

Ci sono alcune parti della soluzione:

  • Come ha detto Lorenzo Boccaccia, usa TreeWillExpandListener

  • Inoltre , è necessario chiamare nodesWerInserted sull'albero, quindi verrà visualizzato il numero corretto di nodi. Visualizza questo codice

  • Ho stabilito che se non si conosce il conteggio figlio, TreeNode.getChildCount () deve restituire almeno 1 (non può restituire 0)

Altri suggerimenti

http://java.sun.com /docs/books/tutorial/uiswing/components/tree.html#data

scorri un po 'verso il basso, c'è il tutorial esatto su come creare nodi di caricamento pigri per il jtree, completo di esempi e documentazione

Non sono sicuro che sia del tutto applicabile, ma recentemente ho aggirato i problemi con un albero lento pre-calcolando le risposte ai metodi che normalmente richiederebbero di passare attraverso l'elenco dei bambini. Li ricalco solo quando i bambini vengono aggiunti, rimossi o aggiornati. Nel mio caso, alcuni dei metodi avrebbero dovuto andare in modo ricorsivo lungo l'albero per capire cose come "quanti byte sono memorizzati" per ciascun nodo.

Se hai bisogno di molto accesso a una particolare funzionalità della tua struttura di dati che è costosa da calcolare, può avere senso pre-calcolarla.

Nel caso di TreeNodes, ciò significa che i tuoi TreeNodes dovrebbero archiviare il loro conteggio figlio. Per spiegarlo un po 'più in dettaglio: quando si crea un nodo n0 questo nodo ha un conteggio figlio ( cc ) di 0. Quando si aggiunge un nodo n1 come figlio di questo, n1.cc + cc ++ .

Il bit difficile è l'operazione di rimozione. Devi mantenere i backlink per i genitori e salire nella gerarchia per sottrarre il cc del tuo nodo corrente.

Nel caso in cui desideri solo avere la funzione hasChildren per i tuoi nodi o sovrascrivere getChildCount , un valore booleano potrebbe essere sufficiente e non ti costringerebbe a salire su tutto gerarchia in caso di rimozione. Oppure potresti rimuovere i backlink e dire semplicemente che perdi precisione nelle operazioni di rimozione. L'interfaccia TreeNode in realtà non ti obbliga a fornire un'operazione di rimozione, ma probabilmente ne vuoi comunque comunque

Bene, questo è il problema. Al fine di trovare valori precisi precompilati, dovrete conservare backlink di qualche tipo. In caso contrario, è meglio chiamare il metodo hasHadChildren o il isVirgin più divertente.

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