NOTA! Questo sito utilizza i cookie e tecnologie simili.

Se non si modificano le impostazioni del browser, l'utente accetta. Per saperne di piu'

Approvo

Guida Java 2D - Capitolo 35: Elementi della GUI di alto livello: alberi con JTree.


 

JTreePer rappresentare visivamente la nota struttura dati dell'albero (tree), cioè un insieme di nodi connessi gerarchicamente e radicati in una root ('radice'), la libreria Swing mette a disposizione la classe JTree ed altre classi 'accessorie', che prenderemo in esame in questo capitolo.

 

 

 

 

 

 

 

 

 

 

Costruttori:

  • JTree();
  • JTree(TreeModel model);
  • JTree(Object[] obj);
  • JTree(Vector v); .

 

 

 

Metodi utili di tale classe:

collapsePath(TreePath path)   :   void Collassa l'albero.
expandPath(TreePath path)   :   void Espande l'albero.
setRootVisible(boolean rootVisible)   :   void Determina se il nodo radice deve essere visibile.
setShowsRootHandles(boolean b)   :   void Determina se il nodo radice deve avere l'icona di compressione.
scrollPathToVisible(TreePath path)   :   void Espande e rende visibile il nodo finale del path.

 

Per creare da zero un 'modello' di albero, è necessario implementare l'interfaccia TreeModel; fortunatamente per noi, il più delle volte è sufficiente utilizzare la classe DefaultTreeModel, che ci fornisce un TreeModel già pronto.

 

Costruttore di DefaultTreeModel:

  • DefaultTreeModel(TreeNode root); .

 

Metodi utili di tale classe:

getRoot()   :   Object Restituisce il nodo radice dell'albero.
isLeaf(Object node)   :   boolean Verifica se il nodo passato come parametro è foglia (non ha nodi figli).
getPathToRoot(TreeNode aNode)   :   TreeNode[] Restituisce un array contenente, in un array, i nodi facenti parte del path che parte dalla radice dell'albero e giunge al nodo specificato come parametro.

 

Un'altra classe 'accessoria' fondamentale è DefaultMutableTreeNode, che implementa l'interfaccia TreeNode.

 

Un oggetto di tipo DMTN rappresenta un nodo dell'albero, dunque può contenere un qualsiasi Object.

 

Costruttori:

  • DefaultMutableTreeNode();
  • DefaultMutableTreeNode(Object userObject); .

 

Metodi utili di DMTN:

children()   :   Enumeration Restituisce la lista dei figli del nodo che ha invocato il metodo.
breadthFirstEnumeration()   :   Enumeration Restituisce la lista dei nodi ottenuta visitando il sottoalbero radicato nel nodo che ha invocato il metodo mediante l'algoritmo breadth-first.
depthFirstEnumeration()   :   Enumeration Restituisce la lista dei nodi ottenuta visitando il sottoalbero radicato nel nodo che ha invocato il metodo mediante l'algoritmo depth-first.
postorderEnumeration()   :   Enumeration Restituisce la lista dei nodi ottenuta visitando il sottoalbero radicato nel nodo che ha invocato il metodo mediante l'algoritmo postorder.
preorderEnumeration()   :   Enumeration Restituisce la lista dei nodi ottenuta visitando il sottoalbero radicato nel nodo che ha invocato il metodo mediante l'algoritmo preorder.
isLeaf()   :   boolean Restituisce true se il nodo che l'ha invocato è una foglia (non ha cioè nodi figli) dell'albero, false altrimenti.
isRoot()   :   boolean Restituisce true se il nodo che l'ha invocato è la radice dell'albero, false altrimenti.
getLevel()   :   int Restituisce il livello del nodo che l'ha invocato (la sua 'distanza' dalla radice).

 

Alla selezione di un nodo è associato l'evento TreeSelectionEvent, rilevabile mediante il listener TreeSelectionListener, che richiede l'implementazione del metodo:

  • valueChanged(TreeSelectionEvent e) .

 

E' possibile specificare la modalità di selezione dei nodi mediante il metodo:

  • setSelectionMode(int mode)    :   void

di TreeSelectionModel, recuperabile con il metodo di JTree:

  • getSelectionModel()   :   TreeSelectionModel .

 

I valori possibili per il parametro mode di setSelectionMode sono (costanti predefinite):

  • SINGLE_TREE_SELECTION;
  • CONTIGUOUS_TREE_SELECTION;
  • DISCONTIGUOUS_TREE_SELECTION.

 

Per specificare la modalità di visualizzazione di una cella (icone diverse per nodi interne e foglie, ecc...) bisogna implementare l'interfaccia TreeCellRenderer ed impostarla nel JTree.

 

Tale interfaccia richiede l'implementazione di un metodo:

  • getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus)   :   Component

che specifica la modalità di visualizzazione dei nodi di un JTree; in alternativa, è possibile estendere la classe DefaultTreeCellRenderer.

 

Vediamo adesso come inserire o eliminare dei nodi o modificarne il contenuto.

 

Per effettuare queste operazioni è necessario rendere modificabile l'albero, per cui bisognerà invocare il metodo di JTree:

  • setEditable(boolean b)   :   void

 

A questo punto, bisogna ricavare l'oggetto associato al nodo selezionato, al fine di poter effettuare una delle suddette operazioni; a tale scopo, è possibile utilizzare il metodo di JTree:

  • getLastSelectedPathComponent()   :   Object .

 

Ecco, quindi, i tre metodi utilizzabili per effettuare le operazioni di inserimento, modifica e cancellazione di nodi:

insertNodeInto(MutableTreeNode newChild, MutableTreeNode parent, int index)   :   void Inserisce, come figlio di parent, il figlio newChild in posizione (tra i figli di parent) index.
removeNodeFromParent(MutableTreeNode node)   :   void Rimuove il nodo specificato dall'albero.
nodeChanged(TreeNode node)   :   void Metodo da richiamare DOPO AVER MODIFICATO il nodo selezionato (ottenuto con getLastSelectedPathComponent() ) per 'convalidare' e registrare la modifica.

 

 

 
Vai all'inizio della pagina