Visualizzazione dei risultati da 1 a 7 su 7

Discussione: (java) jprogressbar

  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2002
    Messaggi
    883

    (java) jprogressbar

    Volevo utilizzare un jprogress bar all'interno di un programma.
    Praticamente quando l'utente preme un bottone, il programma si connette ad un server, scarica i dati e li visualizza in una jdialog.
    Mentre viene fatta la richiesta al server, il programma rimane bloccato, volevo inserire una jprogress bar che visualizzasse lo stato di compeltamento di download dei dati.
    Ho provato a leggeere la documentazione su l sito della sun ma non sono riuscito a ricavare un ragno dal buco.
    Il metodo che richiede i dati al server l'ho fatto così:

    codice:
    public void download() {
    		MyProgressBar m = new MyProgressBar(frame);
    		m.startLoading();
    		try {			
    			//richiesta dati ad un server
    			List list = getInfo();
    			//mostro una dialog con i dati ricevuti dal server
    			showInfo(list);
    		} catch (Exception ex) {
    			ex.printStackTrace();
    		}
    	}
    La classe che implementa la mia jprogress bar è la seguente:

    codice:
    import java.awt.BorderLayout;
    import java.awt.Dimension;
    import java.lang.reflect.InvocationTargetException;
    
    import javax.swing.JDialog;
    import javax.swing.JPanel;
    import javax.swing.JProgressBar;
    import javax.swing.JTextField;
    import javax.swing.SwingUtilities;
    
    public class MyProgressBar extends JPanel {
    	Thread loadThread;
    	Object lock = new Object();
    	JProgressBar progressBar;
    	private JDialog dialog;
    	private JFrame frame;
    	
    	public MyProgressBar(JFrame frame) {
    		
    		this.frame = frame;
    		setLayout(new BorderLayout());
    		setPreferredSize(new Dimension(350, 40));
    		progressTextField = new JTextField();	
    
    		JPanel bottomPanel = new JPanel();
    		progressBar = new JProgressBar();
    		progressBar.setStringPainted(true);
    		bottomPanel.setLayout(new BorderLayout());
    		bottomPanel.add(progressBar, BorderLayout.CENTER);
    		add(bottomPanel, BorderLayout.CENTER);
    		
    		dialog = new JDialog(studioFrame, true);
    		dialog.setTitle("Download dati in corso");
    		dialog.setDefaultCloseOperation(JDialog.EXIT_ON_CLOSE);		
    		 
    		this.setOpaque(true); 
    		dialog.setContentPane(this);
    				
    		dialog.pack();
    		dialog.setLocationRelativeTo(frame);
    		dialog.setVisible(false);
    		
    	}
    	public void startLoading() {
    		System.out.println("start ");
    		
    		if (loadThread == null) {
    			System.out.println("go");
    			loadThread = new LoadThread();
    			shouldStop = false;
    			//loadThread.start();
    			try {
    				loadThread.join();
    			} catch (InterruptedException e) {				
    				e.printStackTrace();
    			}
    		}
    		dialog.setVisible(true);
    	}
    
    	class LoadThread extends Thread {
    		public void run() {
    			System.out.println("thread ");
    			int min = 0;
    			final int max = 50;
    			progressBar.setValue(min);
    			progressBar.setMinimum(min);
    			progressBar.setMaximum(max);
    			Runnable runner = new Runnable() {
    				public void run() {
    					int value = progressBar.getValue();
    					value++;
    					progressBar.setValue(value);
    					System.out.println("value "+value);
    					if (value == max)
    						dialog.dispose();				
    				}
    			};
    			for (int i = min; i <= max; i++) {
    				try {
    					SwingUtilities.invokeAndWait(runner);
    				} catch (InvocationTargetException e) {
    					break;
    				} catch (InterruptedException e) {
    					// Ignore Exception
    				}
    				synchronized (lock) {
    					try {
    						lock.wait(100);
    					} catch (InterruptedException e) {
    						// Ignore Exception
    					}
    				}
    			}
    			loadThread = null;
    		}
    	}
    
    }
    Per come è implementato ora il codice, succede questo:
    L'utente preme il bottone di download
    Compare la progress bar che si incrementa fino al 100%
    Il programma si blocca per scaricare i dati dal server
    Viene visualizzata la dialog con le info scaricate.

    Io vorrei che lo scaricamento dei dati dal server avvenisse mentre è in esecuzione la jprogress bar.

    Qualcuno sa aiutarmi?

    THX

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,333
    Cerco di esprimere il mio parere a livello puramente teorico: secondo la percezione alla quale siamo abituati, una ProgressBar dovrebbe aumentare man mano che si scaricano dati o che un'elaborazione viene completata, partendo da una barra vuota che coincide con l'inizio delle operazioni e concludendosi con una barra piena che coincide con la fine del processo, possibilmente ottenendo un riempimento graduale.

    Senza addentrarmi nei dettagli, mi pare che il tuo codice definisca una ProgressBar che si incrementa in modo asincrono rispetto alla ricezione dei dati (usa un thread), senza seguire il comportamento che ho descritto sopra (ad esempio, la ProgressBar raggiunge il pieno riempimento mentre il download è ancora in corso).

    Non sono a conoscenza delle modalità con cui reperisci i dati dal server, ma secondo me dovresti tentare di inserire in un thread esterno tutta la problematica di ricezione dei dati, cercando di ottenre dalla classe utilizzata per il download dei "risultati parziali" riguardo i dati scaricati che, confrontati con i dati da scaricare nel loro complesso, ti consenta di poter attribuire alla ProgressBar un valore di stato del processo che sia affidabile.

    Purtroppo utilizzo Java da poco, quindi non sono in possesso di esempi plausibili da poter citare o inviare per spiegare meglio il concetto, anche se sospetto che sia la stessa cosa che hai pensato tu.

    Spero comunque di averti dato indicazioni utili per risolvere il problema.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2002
    Messaggi
    883
    il concetto è chiaro, l'implementazione non riesco a farla
    Allora i dati parziali non li posso avere, quindi io mettevo una progress bar che si incrementa per 10 secondi (sapendo che il processo di richiesta dati al server non ci mette mai più di 5 secondi per averli)
    Il problema è questo, mentre la jprogress bar si incrementa non riesco a dire al codice di eseguire l'operazione di ricezione dati, aspettare che la jprogress bar si chiuda e visualizzare la jdialog con i dati scaricati

  4. #4
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    La barra dovresti aggiornarla in base ai dati che ricevi, sapendo a priori qual è la dimensione dei dati che riceverai e settando di volta in volta il valore della barra in base al rapporto (dati ricevuti/dati totali). Sul sito della sun ricordo che c'erano dei tutorial sulle progress bar, se non li hai letti dacci uno sguardo.


  5. #5
    Utente di HTML.it
    Registrato dal
    Oct 2002
    Messaggi
    883
    il mio problema non è quello di sapere di che percentuale aggiornare il numero sulla jprogress bar
    Il problema è quello di dire al programma di eseguire una parte di codice mentre viene visualizzata una progress bar

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,306
    Le barre di avanzamento, al contrario di quello che gli utenti normali pensano, non visualizzano un avanzamento infinitesimalmente corretto. Esse, infatti, si usano in questo modo:

    1) Si esegue una parte del lavoro (quantificabile numericamente)

    2) Si aggiorna la barra di avanzamento di quella parte di lavoro svolto.

    3) Si ritorna al punto 1

    Questo significa che la barra di avanzamento non si aggiorna "in contemporanea" al lavoro svolto, ma viene continuamente aggiornata ogni volta che il lavoro è stato svolto.

    Esempio: se devi trasferire un file e ti serve una barra di avanzamento (JProgressBar) che visualizza la percentuale di file trasferita, dovresti agire nel seguente modo:

    1) Calcolare la dimensione totale del file da trasferire e settare il relativo valore massimo nella JProgressBar

    2) Trasferire un "pacchetto" di dati di dimensione prefissata (al massimo l'ultimo di questi pacchetti è di dimensione inferiore)

    3) Aggiornare la JProgressBar al valore accumulato aggiungendo la dimensione del pacchetto appena trasferito.

    La percentuale viene automaticamente fornita dalla JProgressBar attraverso il metodo getPercentComplete() e può essere impostato il relativo testo nella barra di avanzamento attraverso il metodo setString().


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  7. #7
    Utente di HTML.it
    Registrato dal
    Oct 2002
    Messaggi
    883
    supponiamo di non poter spezzettare il tempo di attesa perchè faccio una richiesta di connessione al server ed il server mi risponde dopo 10 secondi

    MEntre aspetto questo tempo voglio visualizzare una barra di progressione

    Volevo implementarla nel seguente modo

    Qaundo l'utente preme un bottone, il programma java si sdoppia in 2 thread

    un thread fa la richiesta al server e aspetta la risposta
    un altro thread visualizza una barra di progressione che si incrementa per 20 secondi (cioè un tempo sufficientemente lungo da avere la garanzia che il server abbia risposto)

    Terminato l'incremento della barra di connessione, continuo ad eseguire il codice che segue la richiesta di connessione

    Si può fare? in che modo ?

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 © 2024 vBulletin Solutions, Inc. All rights reserved.