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

    [Java] ComponentListener su JPanel

    Il JFrame principale dell'applicazione contiene un JPanel con BorderLayout. A sinistra c'è un JTree, al centro c'è uno JScrollPane. Ogni volta che premo un nodo sul JTree la view dello JScrollPane viene cambiata, dandogli un MyPanel. Questi MyPanel contengono JTextField, JComboBox e JTextPane e vengono inizializzati con i dati di un DB.
    Quando modifico i controlli, una variabile booleana mi diventa true.

    Avevo pensato di aggiungere al MyPanel un ComponentListener per far si che quando io clicco sull'albero, il vecchio MyPanel "sentisse" che non è più visibile e mi desse l'opportunità di chiedere se salvare i dati modificati prima di cambiare vista.
    Solo che l'unico evento che mi intercetta è il resized, mentre gli altri no.
    Dove sbaglio?
    C'è qualche altro metodo per intercettare quando un JPanel sta per essere cambiato in una JScrollPane da un altro? Io preferirei fare tutto nella classe del MyPanel se possibile.
    al volante son nervoso

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: [Java] ComponentListener su JPanel

    Originariamente inviato da Rubox
    Dove sbaglio?
    Probabilmente l'approccio. Tu dici "viene cambiata, dandogli un MyPanel" ma io chiedo (anche se lo suppongo): un nuovo MyPanel, giusto?

    E domanda: perché devi proprio istanziare un nuovo MyPanel ogni volta? Non puoi (ri)usare la stessa istanza cambiando/aggiornando semplicemente i dati? Nel tuo MyPanel potresti mettere un metodo es. setDati(....). Se i dati "correnti" sono "dirty" (modificati) li salvi prima di settare i nuovi dati.

    Insomma, non fermarti/fissarti al primo approccio che ti viene in mente ....
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    502

    Re: Re: [Java] ComponentListener su JPanel

    Originariamente inviato da andbin
    Probabilmente l'approccio. Tu dici "viene cambiata, dandogli un MyPanel" ma io chiedo (anche se lo suppongo): un nuovo MyPanel, giusto?

    E domanda: perché devi proprio istanziare un nuovo MyPanel ogni volta? Non puoi (ri)usare la stessa istanza cambiando/aggiornando semplicemente i dati? Nel tuo MyPanel potresti mettere un metodo es. setDati(....). Se i dati "correnti" sono "dirty" (modificati) li salvi prima di settare i nuovi dati.

    Insomma, non fermarti/fissarti al primo approccio che ti viene in mente ....
    Si gli do un nuovo MyPanel. Il fatto è che l'albero può "contenere" e far visualizzare un CasaPanel, un NegozioPanel, un UfficioPanel, e via dicendo. Non è sempre lo stesso MyPanel come layout che viene dato alla view.

    Se capisco bene quello che hai scritto: nella classe principale dell'applicazione, dove c'è l'albero e la sua gestione, crea anche i vari Panel e li tengo li. Quando devo visualizzare un Panel di un certo tipo, gli passo i dati che deve visualizzare.
    Però dovrei memorizzare anche il vecchio Panel (che sarebbe poi quello corrente, a proposito devo vedere se un metodo della JScrollView mi restituisce il componente attualmente visualizzato) e da quello verificare se i dati sono stati modificati prima di sostituirlo.
    al volante son nervoso

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Re: Re: [Java] ComponentListener su JPanel

    Originariamente inviato da Rubox
    l'albero può "contenere" e far visualizzare un CasaPanel, un NegozioPanel, un UfficioPanel, e via dicendo.
    Ahhh ok, non potevo saperlo ...

    Originariamente inviato da Rubox
    Se capisco bene quello che hai scritto: nella classe principale dell'applicazione, dove c'è l'albero e la sua gestione, crea anche i vari Panel e li tengo li. Quando devo visualizzare un Panel di un certo tipo, gli passo i dati che deve visualizzare.
    Però dovrei memorizzare anche il vecchio Panel (che sarebbe poi quello corrente, a proposito devo vedere se un metodo della JScrollView mi restituisce il componente attualmente visualizzato) e da quello verificare se i dati sono stati modificati prima di sostituirlo.
    No alt. Ora è già più chiaro di prima. Ma .... vediamo la cosa sotto un altro punto di vista.

    Questi diversi tipi di pannelli hanno "qualcosa" in comune? Intendo proprio dal punto di vista della gerarchia delle classi. Estendono una "tua" superclasse? (dovrebbero ... e tra poco capirai perché)

    Se tu facessi una classe DatiPanel da cui derivano CasaPanel, ecc.... potresti fare un metodo nella tua classe, es.

    void setPannello(DatiPanel)

    Questo metodo usa una variabile di istanza che indica il pannello corrente. E sarebbe sufficiente "sapere" che qualunque dei DatiPanel ha dei metodi del tipo:

    isModificato()
    salvaDati()

    A quel punto setPannello dovrebbe solo vedere se il pannello corrente è "modificato", salvare i dati, settare nella variabile di istanza il nuovo pannello passato e assegnarlo anche nel JScrollPane.

    E come vedi non c'è bisogno di "sentire" quando la "view" del JScrollPane cambia!!

    E ripeto: non vedere le cose sotto 1 unico punto di vista .... sfrutta la OOP, "incapsulazione", "ereditarietà", ecc.... Sono queste le "chiavi".
    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
    Allora, tutti i vari Panel che utilizzo estendono una classe MyPanel, per impostare a tutti lo stesso sfondo.
    Poi ogni Panel ha una sua classe (ovviamente) e il costruttore di ciascuno accetta un tipo di dati differenti, poichè ogni Panel poi è "disegnato" in modo differente.
    E ogni Panel specifico ha già una variabile datiModificati con i suoi getter e setter.
    In pratica:
    codice:
    public class MyGradientPanel extends JPanel{
    private boolean datiModificati;
    
    }
    
    public class CasaPanel extends MyGradientPanel {}
    public class UfficioPanel extends MyGradientPanel {}
    public class NegozioPanel extends MyGradientPanel {}
    E' meglio se ci guardo domani perché adesso c'è il cervello che non ragiona
    (o forse sto solo pensando a tutto il trigo che ho fatto e che non serve quasi a nulla)
    al volante son nervoso

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    502
    Vedo di spiegare meglio come ho strutturato la mia applicazione altrimenti non ne vengo a capo mi sa.

    Come detto c'è un albero. Viene popolato di nodi in base ai dati prelevati da un DB. I nodi, in base al differente dato prelevato (Casa, Ufficio, Negozio, Fabbrica ecc ecc) sono delle classi del tipo CasaNodeInfo, UfficioNodeInfo ecc.
    Sull'albero ho un listener che quando il nodo cambia:
    0) richiama un metodo ricorsivo findPanel(jScrollPane.getComponents()) che ricerca il panel associato allo JScrollPane e legge il valore della variabile datiModificati
    1) stabilisce che tipo di nodo è stato selezionato
    2) in base al tipo di nodo recupera i dati in esso contenuti (in pratica memorizzo nella struttura XxxNodeInfo gli indici dei vari Vector che mi contengono i dati presi dal DB)
    3) in base al tipo di nodo mi crea il panel corrispondende passandogli i dati (ogni tipo di panel accetta il suo tipo di dato, ossia CasaPanel(datiCasa), UfficioPanel(datiUfficio)
    4) imposto questo panel come view dello JScrollPane

    Ok... giornata terminata. Posso darmi del pirla da solo? Fatto
    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 © 2026 vBulletin Solutions, Inc. All rights reserved.