View Full Version : [JAVA] JProgressBar maledetta
franksisca
30-05-2009, 21:17
allora, partendo dal presupposto che sono fuso a livello celebrale...dopo 10 ore di programmazione sono compatibile :D
allora, io in un metodo che genera un file faccio ESATTAMENTE queste cose:
compilaPrimaParte();
compilaSecondaParte();
compilaTerzaParte();
compilaQuartaParte();
compilaQuintaParte();
volevo aggiungere la progress bar che mi visualizza le percentuali di completamento (ovviamente 20% ognuno).
ho capito che devo usare i thread e ho trovato pgi (http://www2.mokabyte.it/forum/thread.jsp?forum=15&thread=1593)da ogni parte e ogni ovunque.....ma non riesco a farlo -.-
Esempio pulito pulito e aggiornato.
import java.awt.*;
import java.awt.event.*;
import java.beans.*;
import javax.swing.*;
public class Main {
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
new Main().start();
}
});
}
private volatile boolean interrupted;
private void start() {
final SwingWorker<Void, Void> executor = new SwingWorker<Void, Void>() {
@Override
public Void doInBackground() {
primaInvocazione();
setProgress(20);
secondaInvocazione();
setProgress(40);
terzaInvocazione();
setProgress(60);
quartaInvocazione();
setProgress(80);
quintaInvocazione();
setProgress(100);
return null;
}
};
final JProgressBar progressBar = new JProgressBar(0, 100);
executor.addPropertyChangeListener(new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent e) {
if("progress".equals(e.getPropertyName())) {
progressBar.setValue((Integer)e.getNewValue());
}
}
});
JButton starter = new JButton(new AbstractAction("Start") {
public void actionPerformed(ActionEvent e) {
executor.execute();
}
});
JToolBar toolbar = new JToolBar();
toolbar.add(starter);
JFrame window = new JFrame("Progress Test");
window.add(toolbar, BorderLayout.NORTH);
window.add(progressBar, BorderLayout.SOUTH);
window.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
window.setSize(400, 300);
window.setVisible(true);
}
private void primaInvocazione() {
sleep(1000);
}
private void secondaInvocazione() {
sleep(1000);
}
private void terzaInvocazione() {
sleep(1000);
}
private void quartaInvocazione() {
sleep(1000);
}
private void quintaInvocazione() {
sleep(1000);
}
private void sleep(long ms) {
try {
Thread.sleep(ms);
} catch(InterruptedException ex) {
interrupted = true;
}
}
}
main passa la palla a start. SwingWorker fa il lavoro sporco. Ad ogni colpo di scopa invoca il proprio setProgress(x). setProgress spara un PropertyChangeEvent nell'EDT. Data una progress bar se un PropertyChangeListener resta in ascolto per le mutazioni di "progress" in quello SwingWorker otteniamo la comunicazione tra il lavoro eseguito dal Thread in background gestito da SwingWorker e la nostra GUI. Il resto č un pulsante che avvia SwingWorker e una finestra per impacchettare il tutto.
franksisca
31-05-2009, 13:04
ho risolto convertendo la classe che doveva gestirmi le operazioni in thread....cmq terrņ il tuo codice a mente per il futuro :D
sempre grazzie :D
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.