[ListSelectionListener] comment utiliser les threads?
Bonjour,
J'ai développé une application avec une interface graphique qui contient (entre autres) une JList dans un JScrollPane.
Quand on sélectionne une ligne de la liste, l'image correspondante doit s'afficher dans un JPanel et une barre de status est mise à jour.
J'ai obtenu le résultat que j'attendais en implémentant le ListSelectionListener suivant :
Code:
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 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
|
/**
* Projet : LAM
* Paquetage : fr.statlife.LAM.IHM
* Fichier : MammoSelectionListener.java
*
* @author Mathilde Pellerin
* @date 12 mai 2010
*/
package fr.statlife.LAM.IHM;
import java.awt.Color;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import fr.statlife.LAM.Controleur;
import fr.statlife.LAM.Image;
/**
*
* @author Mathilde Pellerin
*/
public class MammoSelectionListener implements ListSelectionListener
{
private JList liste;
private FenetreLAM fenetre;
private Controleur control;
public MammoSelectionListener(FenetreLAM fenetre)
{
this.liste = fenetre.getListeMammos();
this.control = fenetre.getControl();
this.fenetre = fenetre;
}
/* (non-Javadoc)
* @see javax.swing.event.ListSelectionListener#valueChanged(javax.swing.event.ListSelectionEvent)
*/
@Override
public void valueChanged(ListSelectionEvent e)
{
//Le listener etant toujours appele avant de selectionner l'element pour ajustement
// on s'assure que la selection est bien faite avant de lancer le traitement
if(!e.getValueIsAdjusting())
{
Object[] mammosSelectionnees = liste.getSelectedValues();
if(mammosSelectionnees.length == 1)
{
Mammo mammoSelectionnee = (Mammo)mammosSelectionnees[0];
String nomMammo = mammoSelectionnee.getNom();
Image[] images = control.afficherMammo(nomMammo);
//Affichage de la mammographie native
fenetre.getPanneauMammoNative().setImg(images[0].getImage());
fenetre.getStatusNative().setText("Mammographie : "+nomMammo);
String etatMammo = control.getEtatMammo(nomMammo);
//Recuperation de la barre de status analysee
JLabel statusAnalysee = fenetre.getStatusAnalysee();
if(etatMammo.equals("EnAttenteAnalyse"))
{
fenetre.getPanneauMammoAnalysee().setImg(null);
statusAnalysee.setText("Mammographie en attente d'analyse");
statusAnalysee.setBackground(Color.white);
fenetre.getBoutonValidation().setVisible(false);
fenetre.getBoutonInvalidation().setVisible(false);
}
else
{
fenetre.getPanneauMammoAnalysee().setImg(images[1].getImage());
if(etatMammo.equals("EnAttenteValidation"))
{
statusAnalysee.setText("Densité mammaire : "
+ control.getDensite(nomMammo)+"%");
statusAnalysee.setBackground(Color.white);
JButton valide = fenetre.getBoutonValidation();
valide.setVisible(true);
valide.setName(nomMammo);
JButton invalide = fenetre.getBoutonInvalidation();
invalide.setVisible(true);
invalide.setName(nomMammo);
}
else if(etatMammo.equals("Valide"))
{
statusAnalysee.setText("Densité mammaire : "
+ control.getDensite(nomMammo)+"%");
statusAnalysee.setBackground(MammoCellRenderer.couleurValide);
fenetre.getBoutonValidation().setVisible(false);
fenetre.getBoutonInvalidation().setVisible(false);
}
else if(etatMammo.equals("Invalide"))
{
statusAnalysee.setText("Densité mammaire : "
+ control.getDensite(nomMammo)+"%. Invalidée.");
statusAnalysee.setBackground(MammoCellRenderer.couleurInvalide);
fenetre.getBoutonValidation().setVisible(false);
fenetre.getBoutonInvalidation().setVisible(false);
}
}
}
}
}
} |
maintenant que je teste l'appli avec une liste un peu plus grande que celle utilisée pour les premiers tests, je me rends compte que lors de la première sélection, l'application se fige quelques instants. J'ai lu pas mal de posts et de tutos à ce sujet et je pense que ça vient du fait que je n'utilise pas de thread dans mon listener, et que le traitement que je pensais rapide est plus long que prévu et bloque l'EDT.
Le problème, c'est que je n'arrive pas à régler le problème justement :aie:: j'ai un peu de mal avec les threads, et malgré plusieurs lectures du tuto de GFX, je ne vois pas bien ce qu'il faut que je fasse :
faut-il appeler la méthode invokeLater du SwingUtilities pour chaque mise à jour de l'interface (auquel cas ça rajoute un paquet monstrueux de codes, c'est pour ça que je n'ai pas encore testé cette solution)?
ou faut-il que je fasse un nouveau thread juste pour l'appel à :
Code:
Image[] images = control.afficherMammo(nomMammo);
qui ne me semble pas particulièrement long, mais bon, comme c'est des images, ça prend peut être plus de temps que je ne crois?...
J'ai essayé cette dernière solution sans succès (à cause des variables qu'il faut mettre en final...)
Bref, je galère un peu là :aie:
Merci d'avance pour tout conseil ou doc que j'aurais loupé.