Visualizzazione dei risultati da 1 a 5 su 5

Discussione: problema con le swing

  1. #1

    problema con le swing

    ciao a tutti,
    ho un piccolo problema.. H
    Ho scritto un applicazione che dandogli in pasto un database restituisce un file con gli indirizzi standardizzati. Il problema però è il seguente. Quando l'app fa il controllo degli indirizzi e scrive questi sul file la GUI rimane bloccata (i bottoni e checkbox sono "congelati" e la progressbas è ferma). L'app finisce e la GUI è di nuovo attiva e la progressbar da il 100%. Che sbaglio ??

    ciao ciao
    plume

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

    Re: problema con le swing

    Originariamente inviato da -plume83-
    Che sbaglio ??
    Le solite questioni sul "threading" in Swing.

    --> Threads and Swing
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    grazie per la risposta!
    avevo letto qualcosa proprio ora mentre cercavo su google qualche aiuto..
    non sapresti dove possa trovare degli esempi ?? non ho trovato nulla..

    ciao ciao
    plume

    ho provato così (ad avviare la gui)


    Codice PHP:
        public static void main(String[] args) {
            
    // TODO Auto-generated method stub
            
    javax.swing.SwingUtilities.invokeLater(new Runnable() {
                public 
    void run() {
                    
    showMainGUI();
                }
            });
        } 
    basta per evitare i blocchi ??

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da -plume83-
    basta per evitare i blocchi ??
    No affatto.

    La questione è molto semplice: tutta la interfaccia grafica è gestita da un unico e solo thread chiamato, così come lo dice la documentazione, EDT (event dispatch thread).
    Quindi c'è questo unico "flusso" di esecuzione che di tanto in tanto disegna la interfaccia utente, dispaccia gli eventi e altro.

    Quando ricevi notifica di un evento e viene invocato un metodo di un listener, sei nel contesto del EDT:

    Se fai ad esempio:

    codice:
    public void actionPerformed(ActionEvent e) {
        label.setBackground(Color.RED);
    
        // tue operazioni lunghe per parecchio tempo
    
        label.setBackground(Color.SILVER);
    }
    NON vedi che la label diventa rossa, poi passa del tempo e la label diventa grigia!!! Il rosso proprio NON lo vedi!!! Anzi, tutta la tua interfaccia utente è "congelata".

    Lì sei nel contesto del EDT ... e lo stai tenendo impegnato tu con le tue "operazioni lunghe". Se lo stai tenendo impegnato tu, il controllo non ce l'ha certo il framework di Java che quindi non può disegnare/aggiornare/notificare nulla altro!!!

    setBackground() come tutti gli altri metodi di modifica, non fa nulla direttamente, imposta solamente uno "stato" e basta. Appena il controllo ritorna al framework, allora si accorge che qualcosa è cambiato e si mette a disegnare/aggiornare/notificare ciò che è necessario.

    E Swing non è "thread safe" .. vuol dire che, salvo casi particolari ben documentati, accedere alla interfaccia utente (in qualunque modo .. get/setQualcosa() o cose simili sui componenti) va fatto solo nel contesto del EDT, non nel contesto di un altro thread.

    Per non dilungarmi troppo: se devi fare operazioni "lunghe" che impiegano del tempo devi farle in un thread separato. Con tutte le dovute precauzioni del caso ... sopratutto per quanto ho appena detto al paragrafo sopra.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    perfetto..
    in pratica devo creare sia un thread per la connessione al mio server mysql e sia quando effettuo l'operazione di standardizzazione. ho visto che con la versione 6 di java tutto è molto semplificato.. peccato che sul mac ho la 5 e non posso aggiornarla.. andrò a creare i thread allora..
    grazie mille per la risposta !!

    ciao ciao
    plume

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.