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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : 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 : Sélectionner tout - Visualiser dans une fenêtre à part
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à
Merci d'avance pour tout conseil ou doc que j'aurais loupé.