Torna indietro   Hardware Upgrade Forum > Software > Programmazione

OPPO Find X9 Pro: il camera phone con teleobiettivo da 200MP e batteria da 7500 mAh
OPPO Find X9 Pro: il camera phone con teleobiettivo da 200MP e batteria da 7500 mAh
OPPO Find X9 Pro punta a diventare uno dei riferimenti assoluti nel segmento dei camera phone di fascia alta. Con un teleobiettivo Hasselblad da 200 MP, una batteria al silicio-carbonio da 7500 mAh e un display da 6,78 pollici con cornici ultra ridotte, il nuovo flagship non teme confronti con la concorrenza, e non solo nel comparto fotografico mobile. La dotazione tecnica include il processore MediaTek Dimensity 9500, certificazione IP69 e un sistema di ricarica rapida a 80W
DJI Romo, il robot aspirapolvere tutto trasparente
DJI Romo, il robot aspirapolvere tutto trasparente
Anche DJI entra nel panorama delle aziende che propongono una soluzione per la pulizia di casa, facendo leva sulla propria esperienza legata alla mappatura degli ambienti e all'evitamento di ostacoli maturata nel mondo dei droni. Romo è un robot preciso ed efficace, dal design decisamente originale e unico ma che richiede per questo un costo d'acquisto molto elevato
DJI Osmo Nano: la piccola fotocamera alla prova sul campo
DJI Osmo Nano: la piccola fotocamera alla prova sul campo
La nuova fotocamera compatta DJI spicca per l'abbinamento ideale tra le dimensioni ridotte e la qualità d'immagine. Può essere installata in punti di ripresa difficilmente utilizzabili con le tipiche action camera, grazie ad una struttura modulare con modulo ripresa e base con schermo che possono essere scollegati tra di loro. Un prodotto ideale per chi fa riprese sportive, da avere sempre tra le mani
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 24-11-2009, 11:43   #1
miao84
Member
 
Iscritto dal: Oct 2009
Messaggi: 239
[JAVA] Implementare Progress Bar

Dovrei implementare una progress bar, su una classe jFrame, che dovrebbe partire quando clicco su un bottone e terminare quando i metodi lanciati all'interno dell'evento del bottone sono finiti...solo che non c'ho mai capito molto sull'utilizzo di questa progress bar..chi sa aiutarmi?

Questo è più o meno quello che avevo in mente...

Codice:
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
            //la progress bar si avvia
            avvia();
            info();
            comprimi();
            riempi();
            //la progress bar arriva 100%
    }
miao84 è offline   Rispondi citando il messaggio o parte di esso
Old 24-11-2009, 17:52   #2
yorkeiser
Senior Member
 
L'Avatar di yorkeiser
 
Iscritto dal: Jul 2006
Città: Tristram
Messaggi: 517
Beh, ci sono vari modi (e molto più sofisticati, potresti usare un timer ad esempio), ma ad esempio puoi partire con una cosa semplice semplice come questa:


Codice:
jpb = new JProgressBar(0, 100);
[...]

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
            //la progress bar si avvia
            avvia();
            jpb.setValue(25);
            info();
            jpb.setValue(50);
            comprimi();
            jpb.setValue(75);
            riempi();
            jpb.setValue(100);
            //la progress bar arriva 100%
    }
__________________
Il sole è giallo
yorkeiser è offline   Rispondi citando il messaggio o parte di esso
Old 24-11-2009, 22:14   #3
^TiGeRShArK^
Senior Member
 
L'Avatar di ^TiGeRShArK^
 
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
http://java.sun.com/javase/6/docs/ap...ingWorker.html
Credo che sia la soluzione migliore se usi java 6...
__________________
^TiGeRShArK^ è offline   Rispondi citando il messaggio o parte di esso
Old 25-11-2009, 15:21   #4
miao84
Member
 
Iscritto dal: Oct 2009
Messaggi: 239
@yorkeiser
con il tuo metodo non mi aggiorna la progress bar progressivamente ma solo alla fine del programma
miao84 è offline   Rispondi citando il messaggio o parte di esso
Old 25-11-2009, 15:33   #5
yorkeiser
Senior Member
 
L'Avatar di yorkeiser
 
Iscritto dal: Jul 2006
Città: Tristram
Messaggi: 517
Quote:
Originariamente inviato da miao84 Guarda i messaggi
@yorkeiser
con il tuo metodo non mi aggiorna la progress bar progressivamente ma solo alla fine del programma
Suppongo si debba lanciare ogni volta un refresh sul pannello o sul singolo elemento grafico (ovvero la progress bar)
Prova a forzare il refresh dell'elemento con

Codice:
jpb.repaint();
ogni volta che modifichi il valore.
O, in alternativa, attendi che passi qualcuno più esperto di me sulle GUI Java e su come funziona il refresh dell'interfaccia.
__________________
Il sole è giallo
yorkeiser è offline   Rispondi citando il messaggio o parte di esso
Old 25-11-2009, 16:06   #6
^TiGeRShArK^
Senior Member
 
L'Avatar di ^TiGeRShArK^
 
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
non può funzionare perchè si deve lanciare in un altro thread altrimenti rimane bloccato l'EDT e di conseguenza anche il refresh dell'interfaccia grafica.
La soluzione standard è in questo caso quella che dicevo prima, lo SwingWorker che permette di gestire in maniera estremamente semplice il tutto senza stare ad impazzire con thread, sincronizzazioni e callback.
Nella pagina che ho linkato c'è un esempio completo di funzionamento di una Progress bar con lo Swing Worker.
__________________
^TiGeRShArK^ è offline   Rispondi citando il messaggio o parte di esso
Old 25-11-2009, 17:14   #7
yorkeiser
Senior Member
 
L'Avatar di yorkeiser
 
Iscritto dal: Jul 2006
Città: Tristram
Messaggi: 517
Quote:
Originariamente inviato da ^TiGeRShArK^ Guarda i messaggi
non può funzionare perchè si deve lanciare in un altro thread altrimenti rimane bloccato l'EDT e di conseguenza anche il refresh dell'interfaccia grafica.
La soluzione standard è in questo caso quella che dicevo prima, lo SwingWorker che permette di gestire in maniera estremamente semplice il tutto senza stare ad impazzire con thread, sincronizzazioni e callback.
Nella pagina che ho linkato c'è un esempio completo di funzionamento di una Progress bar con lo Swing Worker.
Mmmh, interessante.
E se io avessi lanciato quelle istruzioni nella run() di un thread creato ad hoc, piuttosto che lanciarle direttamente nell'ActionPerformed ? Ci sarebbe stato il refresh?
__________________
Il sole è giallo
yorkeiser è offline   Rispondi citando il messaggio o parte di esso
Old 25-11-2009, 17:24   #8
^TiGeRShArK^
Senior Member
 
L'Avatar di ^TiGeRShArK^
 
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
Quote:
Originariamente inviato da yorkeiser Guarda i messaggi
Mmmh, interessante.
E se io avessi lanciato quelle istruzioni nella run() di un thread creato ad hoc, piuttosto che lanciarle direttamente nell'ActionPerformed ? Ci sarebbe stato il refresh?
ni, lanciando in un thread esterno quelle istruzioni avrebbe dato errore dato che avresti provato ad accedere al thread della GUI da un thread esterno...
Per fare le cose bene manualmente avresti dovuto usare SwingUtilities.InvokeLater()
cmq qui è spiegato abbastanza bene il tutto...
http://java.sun.com/products/jfc/tsc.../threads1.html
__________________
^TiGeRShArK^ è offline   Rispondi citando il messaggio o parte di esso
Old 25-11-2009, 22:24   #9
miao84
Member
 
Iscritto dal: Oct 2009
Messaggi: 239
Sono riuscito ad implementare SwingWorker abbastanza bene nel mio codice...solo che rimane il problema di "refresh" della progress bar. Ho cambiato la variabile "int progress" in globale e nelle varie parti dei miei metodi la incremento...solo che la progress bar si aggiorna solamente a fine programma o in alternativa se blocco momentaneamente il programma (per esempio aprendo una finestra di dialogo). Da quanto ho capito nel momento che avvio il task questo rimane in esecuzione mentre il resto del programma va avanti. Momentaneamente non ho il codice sotto,domani lo posto.

P.S:GRAZIE MILLE PER L'AIUTO DATO FINORA!!!
miao84 è offline   Rispondi citando il messaggio o parte di esso
Old 26-11-2009, 00:55   #10
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
I Java Tutorial sono tuoi amici
-> How to Use Progress Bars
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 07-12-2009, 16:00   #11
miao84
Member
 
Iscritto dal: Oct 2009
Messaggi: 239
Quote:
Originariamente inviato da banryu79 Guarda i messaggi
I Java Tutorial sono tuoi amici
-> How to Use Progress Bars
bella risposta Provo a spiegarmi meglio....la progress bar l'ho implementata e ora quando pigio il bottone parte un thread che ho realizzato (funziona nello stesso modo di SwingWorker solo che è più pulito secondo me) che finchè progress (variabile globale che viene incrementata dentro i metodi avvia() ecc.) non arriva a 100 rimane in esecuzione...se lancio solo il thread nel momento in cui clicco il bottone (commento quindi avvia() e gli altri metodi) e incremento progress dentro il thread stesso, la barra aumenta in tempo reale, mentre se lascio anche gli altri metodi all'interno dell'action performed del bottone non aumenta in tempo reale ma setta i vari progress in pochi millisecondi alla fine dell'esecuzione dell'action performed del bottone...spero di essere stato chiaro cmq...

Codice:
public int progress=0;

......

public Client() {
        initComponents();
        progressBar.setMinimum(0);
        progressBar.setMaximum(100);
        progressBar.setValue(0);
        progressBar.setStringPainted(true);
        jButton1.addActionListener(new jButton1action());
}

.......

//CLICCO SUL BOTTONE PER FAR PARTIRE L'ESECUZIONE DEI METODI
public class jButton1action implements ActionListener{
        public void actionPerformed (ActionEvent e){
          new Thread(new thread1()).start(); //parte il thread che dovrebbe incrementare
          avvia();
          infodb();
          comprimi();
          jTextArea1.append("Fine Trasferimento!\n");
          progressBar.setValue(100);
          progressBar.repaint();
        }
    }

.......

public  class thread1 implements Runnable{
        public void run(){
            while (progress<100){ 
                progressBar.setValue(progress);
                progressBar.repaint(); 
                System.out.println(progressBar.getValue());//STAMPA IL VALORE DELLA PROGRESS BAR AGGIORNATO E LO STAMPA IN TEMPO REALE A DIFFERENZA DELLA PROGRESS BAR VISUALIZZATA
                try{Thread.sleep(400);} //Sleep
                catch (InterruptedException err){}
            }
        }
    }
naturalmente progress come detto sopra lo incremento nei metodi...sono diversi giorni che provo e riprovo, ho visto i tutorial ma probabilmente faccio un errore di fondo io...

EDIT: come la progress bar non mi aggiorna in tempo reale nemmeno la jTextArea. L'unica "gabola" che ho trovato per far scorrere entrambi in tempo reale, come già detto è avviare un Message dialog dopo ogni incremento, ma non posso certo lasciare che per ogni aggiornamento della barra compaia una finestra...

Ultima modifica di miao84 : 07-12-2009 alle 16:08.
miao84 è offline   Rispondi citando il messaggio o parte di esso
Old 07-12-2009, 16:52   #12
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Quel thread non va bene. Ti faccio un esempio con swing worker, ritagliato sullo schema del tuo codice:

Codice:
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class Main {

	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				new Main().createAndShowUI();
			}
		});
	}
	
	private void createAndShowUI() {
		final int AVVIA = 0;
		final int INFO = 1;
		final int COMPRIMI = 2;
		final int RIEMPI = 3;
		final int FINE = 4;
		
		final JFrame window = new JFrame("Test");
		final JProgressBar bar = new JProgressBar(0, 100);
		final JDialog progressDialog = new JDialog(window, true);
		
		progressDialog.add(bar);
		bar.setStringPainted(true);
		
		final JButton button = new JButton(new AbstractAction("Avvia") {
			
			public void actionPerformed(ActionEvent e) {
				
				new SwingWorker<Void, Integer>() {
					
					public Void doInBackground() {
						publish(AVVIA);
						avvia();
						publish(INFO);
						info();
						publish(COMPRIMI);
						comprimi();
						publish(RIEMPI);
						riempi();
						publish(FINE);
						fine();
						return null;
					}
					
					public void process(java.util.List<Integer> steps) {
						for(final Integer step : steps) {
							switch(step) {
								case AVVIA:
									bar.setValue(0);
									bar.setString("Avvio");
									progressDialog.pack();
									progressDialog.setLocationRelativeTo(null);
									progressDialog.setVisible(true);
									break;
								case INFO:
									bar.setValue(25);
									bar.setString("Info");
									break;
								case COMPRIMI:
									bar.setValue(50);
									bar.setString("Comprimi");
									break;
								case RIEMPI:
									bar.setValue(75);
									bar.setString("Riempi");
									break;
								case FINE:
									bar.setValue(100);
									bar.setString("Fine");
									break;
							}
						}
					}
				}.execute();
			}
		});
		
		window.add(button);
		window.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		window.setLocationRelativeTo(null);
		window.pack();
		window.setVisible(true);
	}
	
	public void avvia() {
		pausa(1000);
	}
	
	public void info() {
		pausa(1000);
	}
	
	public void comprimi() {
		pausa(1000);
	}
	
	public void riempi() {
		pausa(1000);
	}
	
	public void fine() {
		
	}
	
	private void pausa(long time) {
		try {
			Thread.sleep(time);
		} catch(InterruptedException ex) {
			ex.printStackTrace();
		}
	}
}
La questione è relativamente semplice, si tratta solo di intervallare le invocazioni in background con gli aggiornamento dell'EDT.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 09-12-2009, 10:09   #13
miao84
Member
 
Iscritto dal: Oct 2009
Messaggi: 239
grazie per la risposta, comunque ho trovato una soluzione più breve ed efficiente facendo partire un'altro thread con all'interno i metodi. Quindi due thread in parellelo fanno si che la progress bar si muova in tempo reale . ciao e grazie a tutti per il supporto!!!
miao84 è offline   Rispondi citando il messaggio o parte di esso
Old 09-12-2009, 10:37   #14
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
se uno dei due thread non è l'edt la soluzione non è più efficiente, è sbagliata.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


OPPO Find X9 Pro: il camera phone con teleobiettivo da 200MP e batteria da 7500 mAh OPPO Find X9 Pro: il camera phone con teleobiett...
DJI Romo, il robot aspirapolvere tutto trasparente DJI Romo, il robot aspirapolvere tutto trasparen...
DJI Osmo Nano: la piccola fotocamera alla prova sul campo DJI Osmo Nano: la piccola fotocamera alla prova ...
FUJIFILM X-T30 III, la nuova mirrorless compatta FUJIFILM X-T30 III, la nuova mirrorless compatta
Oracle AI World 2025: l'IA cambia tutto, a partire dai dati Oracle AI World 2025: l'IA cambia tutto, a parti...
Bill Gates cambia idea sul cambiamento c...
Diella: la parlamentare albanese basata ...
Apple dice addio ai pulsanti meccanici: ...
Battlefield 6 introduce la radio in-game...
Photoshop, basta perdere tempo con opera...
Windows 11, come abilitare il nuovo Menu...
Windows 11 cambia volto: arriva il nuovo...
Console portatile con raffreddamento a l...
iPad Pro 11'' con Chip M4 in super offer...
NVIDIA e Uber insieme per la più ...
Prezzi anomali sui prodotti FRITZ! oggi ...
Portatili Acer e ASUS con 40GB di RAM a ...
Offerte Oral-B su Amazon: sconti fino al...
Withings lancia U-Scan: analisi delle ur...
Huawei lancia i nuovi top di gamma: Pura...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 13:48.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v