Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    [Swing] Aggiornare un JPanel

    Salve a tutti, come posso aggiornate un Jpanel?
    Mi trovo in questa situazione, ho un oggetto (JPanel) che fa delle operazioni, purtroppo il panel viene visualizzato solo dopo che finisce le sue operazioni, ma io vorrei che "apparisse" subito e che mostrasse i cambiamenti durante le operazioni.
    questo è il codice essenziale
    codice:
    class A extends JPanel{
        JLabel msg;
        public A(){
            msg = new JLabel("waiting");
            // fa qualcosa che perde del tempo
            upDate( newMsg );
        }
    
    
        public void upDate( String nMsg ){
            msg.setText( nMsg );
        }
    }
    
    
    class B extends JFrame{
        private A a;
        public B(){
            add( new A() );
        }
    }

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da iJim Visualizza il messaggio
    msg = new JLabel("waiting");
    // fa qualcosa che perde del tempo
    upDate( newMsg );
    No, quel "impegnare del tempo" vuol sicuramente dire che stai tenendo tu occupato il Event Dispatch Thread, e quindi il framework non può aggiornare nulla sulla interfaccia.
    La soluzione ... dipende da cosa devi fare e perché.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Ok, mi spiego meglio, il JPanel fa il download di un file e in base ai bytes ricevuti, voglio mostrare la percentuale, quindi per ogni blocco di byte vorrei aggiornare la label!!

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da iJim Visualizza il messaggio
    Ok, mi spiego meglio, il JPanel fa il download di un file e in base ai bytes ricevuti, voglio mostrare la percentuale, quindi per ogni blocco di byte vorrei aggiornare la label!!
    Di base serve un thread a parte, in cui eseguire il codice di networking per il download. Poi di tanto in tanto (secondo la tua logica) fai passare un pezzetto di codice in un run() di Runnable nel Event Dispatch Thread per aggiornare la interfaccia (con il "solito" invokeLater).

    Se usi almeno Java 6 invece che gestire "a mano" il thread puoi usare il javax.swing.SwingWorker, che però ha un flusso e ciclo di vita ben particolare, che va capito prima di usarlo.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Grazie mille!!!
    Alla fine ho risolto usando i Thread

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.