Visualizzazione dei risultati da 1 a 4 su 4

Discussione: Aiuto su JProgressBar

  1. #1

    Aiuto su JProgressBar

    salve!
    sto cercando di capire come funzionano le JProgressBar che ancora non ho mai usato.
    c'è qualcosa che mi sfugge.
    ho provato questo codice al click su un JButton:
    codice:
        private void btnConnectActionPerformed(java.awt.event.ActionEvent evt) {                                           
            for (int i = 0; i <= 100; i++) {
                final int percent = i;
                System.out.println(i);
                try {
                    SwingUtilities.invokeLater(new Runnable() {
                        @Override
                        public void run() {
                            pBar.setValue(percent);
                        }
                    });
                    Thread.sleep(50);
                } catch (InterruptedException ex) {
                }
            }
    
        }
    in pratica succede che il riempimento della JPB non è graduale, ma avviene tutto alla fine.
    potete dirmi dove sto sbagliando??

  2. #2
    ok intanto per questo sermplice esempio ho trovato.
    creata una classe che estende Thread:
    codice:
    public class SetProgressBar extends Thread {
    
        private static int DELAY = 500;
        JProgressBar progressBar;
    
        public SetProgressBar(JProgressBar bar) {
            progressBar = bar;
        }
    
        @Override
        public void run() {
            int minimum = progressBar.getMinimum();
            int maximum = progressBar.getMaximum();
            Runnable runner;
            runner = new Runnable() {
                @Override
                public void run() {
                    int value = progressBar.getValue();
                    progressBar.setValue(value + 1);
                }
            };
            for (int i = minimum; i < maximum; i++) {
                try {
                    SwingUtilities.invokeAndWait(runner);
                    Thread.sleep(DELAY);
                } catch (InterruptedException | InvocationTargetException ex) {
                    JOptionPane.showMessageDialog(null, ex.getMessage());
                }
            }
        }
    }
    e poi nell'Action del jbutton:
    codice:
     Thread t = new SetProgressBar(pBar);
           t.start();
    vorrei però legarlo in maniera automatica ad un evento.
    cioè vorrei che si riempisse piano piano fino a che una serie di operazioni non sono terminate.
    è possibile??

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2009
    Messaggi
    755
    non so ben spiegarti il perchè non funzioni ma posso suggerirti di mettere tutta la procedura all'interno del runnable di un altro thread del tipo:

    codice:
    button.addActionListener (new ActionListener () {
    	public void actionPerformed (ActionEvent ae) {
    		new Thread (new Runnable () {
    			public void run () {
    				for (int i=0;i<100;i++) {
    					progressBar.setValue (i);
    					try {
    						Thread.sleep (50);
    					}catch (InterruptedException ie) {
    						ie.printStackTrace ();
    					}
    				}
    			}
    		}).start ();
    	}
    });
    In questo caso la cosa funziona e non crea particolari problemi (apparte la pressione del button durante la progressione della barra , in questo caso ci sono due thread che operano sulla barra "contemporaneamente") , ma come è stato trattato più volte nel forum è consigliabile quanto più possibile utilizzare l'invokeLater per quanto riguarda la grafica in modo che sia lo stesso EDT a gestire l'evento (l'unico modo che mi viene in mente per adattare il codice usando l'invokeLater è mediante l'utilizzo del "paintImmediately") ..



  4. #4
    ciao!!
    allora, l'esempio che ho postato sopra funziona, ed è già in un altro thread.
    solo che funziona da sola.
    cioè.
    io vorre fare questo: quando clicco sul bottone mi parte il riempimento, poi la connessione al db con successiva query che riempie una jtable, una volta finito stoppo il thread della progressbar.
    solo che mi succede che la barra comincia a riempirsi solo dopo che la connessione è avvenuta, non durante.
    riposto la classe della progressbar con una correzione:
    codice:
    public class SetProgressBar extends Thread {
    
        private static int DELAY = 500;
        JProgressBar progressBar;
    
        public SetProgressBar(JProgressBar bar) {
            progressBar = bar;
        }
    
        @Override
        public void run() {
            int minimum = progressBar.getMinimum();
            int maximum = progressBar.getMaximum();
            Runnable runner;
            runner = new Runnable() {
                @Override
                public void run() {
                    int value = progressBar.getValue();
                    progressBar.setValue(value + 1);
                }
            };
            for (int i = minimum; i < maximum; i++) {
                try {
                    SwingUtilities.invokeLater(runner);
                    Thread.sleep(DELAY);
                } catch (InterruptedException ex) {
                    JOptionPane.showMessageDialog(null, ex.getMessage());
                }
            }
        }
    }
    poi nel bottone eseguo questo:
    codice:
    Thread t = new SetProgressBar(pBar);
    doConnection(); // METODO DI CONNESSIONE AL DB E QUERYT PER JTABLE
    pBar.setValue(pBar.getMaximum);
    il riempimento non funziona in concomitanza con il metodo doconnection();

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.