1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
| // Le model et la JList :
final DefaultListModel model = new DefaultListModel();
JList list = new JList(model);
// Le SwingWorker qui sera chargé de générer les données.
//
// Le paramétrage <Void, Double> signifie ceci :
// Void : Le type de retour de doInBackground() (inutilisé ici)
// Double : Le type de donnée généré qui sera passé à publish()
// (cela permet de traiter les objets dans l'EDT via process())
SwingWorker<Void, Double> worker = new SwingWorker<Void, Double>() {
/*
* doInBackground() est exécuté dans un thread séparé.
* Cela permet de ne pas bloquer l'interface graphique,
* mais du coup on ne peut pas toucher à l'interface directement.
*
* => On génère les données (aléatoire ici) puis on les passe à la
* méthode publish(). Cette dernière renverra les données vers la méthode
* process() ci-dessous, mais en l'exécutant dans l'EDT :
*/
@Override
protected Void doInBackground() throws Exception {
while (true) {
// Attente aléatoire entre 0 et 1s :
Thread.sleep( (int) (Math.random() * 1000) );
// Génération d'un nombre aléatoire entre 0 et 50000:
Double d = Math.random() * 50000;
// Puis on publie les valeurs :
publish( d );
}
}
/*
* Méthode de traitement des valeurs.
* Cette méthode sera exécuté dans l'EDT avec
* les paramètres passé à publish().
* Cela permet de mettre à jour l'interface (via la modèle ici)
*/
@Override
protected void process(List<Double> chunks) {
// Note : on doit parcourir tous les éléments,
// car plusieurs appels à publish() peuvent être regroupé :
for (Double d : chunks) {
model.addElement(d);
}
}
};
// On n'oublie pas de démarrer le Worker :D
worker.execute();
JScrollPane scroll = new JScrollPane(list);
scroll.setPreferredSize(new Dimension(200, 400));
JOptionPane.showMessageDialog(null, scroll);
System.exit(0); |
Partager