Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 16
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2004
    Messaggi
    313

    [JAVA]Problema aggiornamento JProgressBar

    Salve a tutti.Ho problema con l' aggiornamento di una JProgressBar
    Il codice è questo :
    codice:
    public class ProgresBar extends JDialog implements IWindow{
         
         private JProgressBar progresBar;
         private JPanel panelProgresBar;
           
       public ProgresBar(JFrame frame){
           super(frame,"Progres bar",true);
           this.setResizable(false);
           this.setDefaultCloseOperation(this.DO_NOTHING_ON_CLOSE);
           this.setBounds(450, 300, 400, 100);
           this.progresBar = new JProgressBar();
           this.panelProgresBar = new JPanel();
           this.progresBar.setMinimum(0);
           this.progresBar.setMaximum(100);
           this.panelProgresBar.add(this.progresBar);
           this.getContentPane().setLayout(new BorderLayout());
           this.getContentPane().add(BorderLayout.NORTH,new JLabel("             Wait please......"));
           this.getContentPane().add(BorderLayout.CENTER,this.panelProgresBar);
           }
    
        
       public void updateBar(int newValue){
           this.progresBar.setValue(newValue);
       }
       public int getValueBar(){
           return this.progresBar.getValue();
       } 
        
        public void showWindow() {
            this.setVisible(true);
        }
    }

    Aggiornamento poi dovrebbe essere fatto in un action performed o in altra classe con il codice:

    codice:
     for (int i = 0; i <= 100; i++) {
          final int percent = i;
          try {
            SwingUtilities.invokeLater(new Runnable() {
              public void run() {
                pb.updateBar(percent);
              }
            });
            java.lang.Thread.sleep(100);
          } catch (InterruptedException e) {
            ;
          }
        }
    Ma non succede niente,qual'è il problema?
    Inoltre vorrei far in modo che sia sincronizzata la scrittura su file.

  2. #2
    Utente di HTML.it L'avatar di Metflar
    Registrato dal
    Apr 2007
    Messaggi
    790
    in che senso non succede niente?
    conoscenze: C/C++, Java, PHP, Python
    [No PM tecnici o di qualsiasi genere]

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2004
    Messaggi
    313
    Nn viene fatto aggiornamento della barra

  4. #4
    Utente di HTML.it L'avatar di Metflar
    Registrato dal
    Apr 2007
    Messaggi
    790
    Originariamente inviato da tcc
    Nn viene fatto aggiornamento della barra
    ma la vedi direttamente piena(quindi colorata) o vuota? :master:
    conoscenze: C/C++, Java, PHP, Python
    [No PM tecnici o di qualsiasi genere]

  5. #5
    Utente di HTML.it
    Registrato dal
    May 2004
    Messaggi
    313
    penso che sia vuota poichè ha lo stesso colore della JDialog

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

    Re: [JAVA]Problema aggiornamento JProgressBar

    Originariamente inviato da tcc
    Aggiornamento poi dovrebbe essere fatto in un action performed o in altra classe con il codice:

    codice:
     for (int i = 0; i <= 100; i++) {
          final int percent = i;
          try {
            SwingUtilities.invokeLater(new Runnable() {
              public void run() {
                pb.updateBar(percent);
              }
            });
            java.lang.Thread.sleep(100);
          } catch (InterruptedException e) {
            ;
          }
        }
    Ma non succede niente,qual'è il problema?
    Se tutto questo codice che ho quotato lo esegui in risposta ad un evento, allora sei nel contesto del EDT (event dispatch thread). Con invokeLater viene aggiunto un Runnable alla lista delle "cose da fare" del EDT. Ma finché sei tu che stai tenendo occupato il EDT (facendo un loop e dei sleep()) quei Runnable non verranno eseguiti e nulla verrà aggiornato.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Utente di HTML.it
    Registrato dal
    May 2004
    Messaggi
    313
    Io vorrei fare in modo che questa mia JProgressBar viene aggiornata man mano che viene scritto su di un file una stringa abbastanza lunga.Quindi come vorrei fare:
    alle pressione di un tasto viene chiamato il metodo per scrivere su file e poi subito dopo vorrei fare comparire la barra progressiva per mostrare l'avanzamento.Per ora stavo cercando di fare aggiornare la barra senza essere sincronizzata con la scrittura su file.Come devo operare per realizzare l'aggironamento e poi sincronizzarla con la scrittura su file?
    grazie

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da tcc
    Come devo operare per realizzare l'aggironamento e poi sincronizzarla con la scrittura su file?
    Il codice per la scrittura del file devi eseguirlo in un thread separato, così non tieni bloccato il EDT che quindi potrà eseguire i tuoi Runnable per l'aggiornamento della progress bar.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    Utente di HTML.it
    Registrato dal
    May 2004
    Messaggi
    313
    perhè non funziona?

    codice:
    public class UpdateBar implements Runnable{
        private ProgresBar pb;
        public UpdateBar(ProgresBar pb){
           this.pb = pb;
        
        }
        
        public void run(){
         for (int i = 0; i <= 100; i++) {
          final int percent = i;
          try {
            this.pb.updateBar(percent);
            java.lang.Thread.sleep(100);
          } catch (InterruptedException e) {
            return;
          }
        }
        }
    }
    nell'action performed:
    codice:
     if(e.getActionCommand().equals("Create corpus")){
              System.out.println("Create corpus"); 
              
              this.showWindow(iwin  = new ProgresBar(GraphicInterfaceAgSpit.getInstance(this)));      
              Runnable ping = new UpdateBar((ProgresBar)iwin);
              new Thread(ping).start();
    	
    
             
        }

  10. #10
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da tcc
    perhè non funziona?
    UpdateBar è un Runnable che viene eseguito nel contesto di un nuovo thread e fin qui è ok. Ma se sei in un thread a parte, non devi invocare direttamente this.pb.updateBar(percent) (che va a fare il setValue sulla progress bar).
    Non ti è ancora chiaro che i componenti Swing non sono thread-safe (salvo casi e metodi particolari ben documentati). Quindi in linea generale, andare ad agire su un componente direttamente da un thread che non è il EDT, non va bene.

    Devi usare invokeLater e un ulteriore Runnable per fare la impostazione del valore.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

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.