PDA

View Full Version : [JAVA] Doppia selezione di un nodo in un JTree


c.salvo89
18-05-2011, 18:17
Buona sera a tutti,

ho un problema che non riesco a risolvere in Java. Mi spiego subito:

Ho creato un programma che legge un file e che da questo crea un JTree con possibilità di selezione dei nodi. Ogni nodo del JTree pùò essere visto come una cartella contenente diversi file. Ogni file può essere o non essere selezionato. Nella parte centrale della GUI ho inoltre una JTable sulla quale vado a scrivere le caratteristiche del file selezionato. In poche parole:

Seleziono il file -> Scrivo in tabella le sue caratteristiche;
Deseleziono il file -> Elimino la riga corrispondente della tabella.

Il programma funziona bene ma ho un unico problema: se seleziono un file non posso deselezionarlo immediatamente ma devo prima selezionarne uno nuovo per poi tornare sul precedente.

Io uso il metodo:
tree.addTreeSelectionListener(new TreeSelectionListener(){
public void valueChanged(TreeSelectionEvent event) {
....
TreePath path=tree.getSelectionPath();
DefaultMutableTreeNode selectedNode= (DefaultMutableTreeNode) path.getLastPathComponent();
...
}});

Volevo sapere se esiste un modo per risolvere il mio problema. Grazie anticipatamente per l'aiuto..

PGI-Bis
18-05-2011, 19:07
Se ho capito bene, puoi usare il metodo clearSelection di JTree per deselezionare il nodo corrente senza attivarne un altro.

Poi devi decidere a quale genere di input associare la de-selezione. Di solito si usa la pressione del mouse in un punto dell'albero in cui non ci sono elementi. Per catturare questa specie di evento aggiungi all'albero un mouseListener nel cui mousePressed scriverai:

if(tree.getRowForLocation(mouseEvent.getPoint()) == -1) {
tree.clearSelection();
}

Nota che così facendo il tree sparerà una notifica di mutamento della selezione e l'invocazione di tree.getSelectionPath restituirà null dunque dovrai controllare questo caso nel tuo TreeSelectionListener onde evitare una NullPointerException.

c.salvo89
18-05-2011, 20:01
Grazie mille.. ho risolto con il metodo tree.clearSelection()..