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