Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    502

    [Java] Annullare selezione di un JTree

    Non ho trovato nulla e quindi chiedo.

    Ho uno JFrame con BorderLayout. In WEST ho un JTree, ogni nodo dello JTree se selezionato mi fa cambiare un JPanel in CENTER.
    I JPanel contengono dei controlli di cui posso modificare il valore.
    Ho implementato dei metodi che se modifico i dati di un JPanel associato ad un nodo, mi chiede se voglio salvare le modifiche, non salvarle, oppure annullare.
    Con l'operazione annullare volevo fare in modo che il JPanel rimanesse visualizzato.
    Questo controllo sui dati modificati l'ho inserito nel metodo valueChanged associato al JTree.
    Funziona tutto, solo che se ho selezionato il nodo D, modifico il JPanel visualizzato con D, e poi seleziono ad esempio il nodo R, se faccio Annulla (che è poi associato ad un valore intero ad uno switch) il JPanel del nodo D resta visualizzato, però il JTree mi fa vedere selezionato il nodo R.

    C'è un metodo per intercettare prima l'evento di cambio selezione di un JTree? Quello che in Visual Basic for Application viene chiamato Before Changing?
    al volante son nervoso

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    502
    Aggiungo che ogni volta che seleziono un nodo nel JTree, il JPanel "nasce" non editabile. Poi con un pulsante lo rendo editabile.
    Quindi se dal valueChanged seleziono il vecchio nodo, va si bene, solo che il JPanel si "riapre" in modalità protetta e le modifiche di prima non salvate vanno perse.
    Sto pensando che dovrei salvarmi un boolean da passare ai vari JPanel per far si che vengano ricaricati o no.
    al volante son nervoso

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    502
    Se faccio l'override del metodo processMouseEvent del JTree, in base ad una condizione che passo al JTree (ho esteso la classe in una mia) richiamo super.processMouseEvent(MouseEvent) oppure mouseEvent.consume() sembrerebbe funzionare.

    Andbin mi puoi dare un parere?
    al volante son nervoso

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Rubox
    Aggiungo che ogni volta che seleziono un nodo nel JTree, il JPanel "nasce" non editabile. Poi con un pulsante lo rendo editabile.
    Quindi se dal valueChanged seleziono il vecchio nodo, va si bene, solo che il JPanel si "riapre" in modalità protetta e le modifiche di prima non salvate vanno perse.
    Sto pensando che dovrei salvarmi un boolean da passare ai vari JPanel per far si che vengano ricaricati o no.
    No, io semplicemente farei così (a prescindere dalla logica che hai fatto: inizialmente non editabile e poi con un pulsante lo rende editabile).

    Nel valueChanged presumo invochi un metodo che fa tutta la gestione di scambio dei pannelli. Se il pannello corrente non è "modificato", ok tutto fila liscio e cambi il pannello. Se il pannello è "modificato" allora vuoi mostrare una dialog di richiesta di salvataggio con opzioni sì/no/annulla.

    La dialog la mostri subito (e non fai ancora nulla sui pannelli, ovviamente). In base alla scelta:
    - Sì: salvi i dati e cambi pannello
    - No: non salvi i dati e cambi pannello
    - Annulla: non salvi i dati e non cambi pannello. Invece fai un setSelectionPath() per settare il TreePath "old", che il TreeSelectionEvent fornisce. Questo causa un altro evento, ovviamente. Che richiederebbe di impostare il pannello che però è quello che hai già corrente! In questo caso non dovresti fare nulla. Insomma, la questione è solo poter testare: il pannello richiesto è quello corrente? Allora non c'è nulla da cambiare.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    502
    Originariamente inviato da andbin
    No, io semplicemente farei così (a prescindere dalla logica che hai fatto: inizialmente non editabile e poi con un pulsante lo rende editabile).

    Nel valueChanged presumo invochi un metodo che fa tutta la gestione di scambio dei pannelli. Se il pannello corrente non è "modificato", ok tutto fila liscio e cambi il pannello. Se il pannello è "modificato" allora vuoi mostrare una dialog di richiesta di salvataggio con opzioni sì/no/annulla.

    La dialog la mostri subito (e non fai ancora nulla sui pannelli, ovviamente). In base alla scelta:
    - Sì: salvi i dati e cambi pannello
    - No: non salvi i dati e cambi pannello
    - Annulla: non salvi i dati e non cambi pannello. Invece fai un setSelectionPath() per settare il TreePath "old", che il TreeSelectionEvent fornisce. Questo causa un altro evento, ovviamente. Che richiederebbe di impostare il pannello che però è quello che hai già corrente! In questo caso non dovresti fare nulla. Insomma, la questione è solo poter testare: il pannello richiesto è quello corrente? Allora non c'è nulla da cambiare.
    Adesso provo
    Come al solito parto in 4a e poi la soluzione è più semplice di quello che pensavo.
    al volante son nervoso

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    502
    Ok sembra andare.
    Ho fatto un po' di fatica perché il mio codice è quanto più lontano dall'OOP possa esserci.
    Per adesso funziona (spero, è da un po' che provo e non si blocca in nessuna occasione)
    Ci sono un troppi "if" nel mio codice, ma non saprei proprio come farli diminuire.
    Daltronde se devo confrontare 10 tipi di pannelli differenti...
    al volante son nervoso

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.