Bonjour,

j'ai une IHM en borderLayout dont le panneau central est composé de plusieurs panneau. Lors d'un appui sur un bouton, je veux faire apparaitre un panneau transparent avec un message d'attente sur ce panneau central.
Pour y arrivé, j'ai utilisé un OverlayLayout qui contient en premier un panneau contenant tout ce qui doit être visible en temps normal, et en deuxième un panneau transparent avec le message qui ne doit être visible que dans certains cas.
Le panneau en OverlayLayout est créé lors de la création de la fenetre de la manière suivante :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
panneauCentreSuperposable = new JPanel();
panneauCentreSuperposable.setLayout(new OverlayLayout(panneauCentreSuperposable));
panneauCentreSuperposable.add(panneauPrincipal);
au départ, je créais et ajoutais le panneau transparent dans le constructeur d'un SwingWorker, je le rendais visible au début du doInBackground et le cachais à la fin du done() :
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
	public SwingWorkerAffichage(FenetreLAM fenetre, Mammo mammo)
	{
		this.fenetre = fenetre;
		this.control = fenetre.getControl();
		this.mammo = mammo;
		this.panneauSuperposable = fenetre.getPanneauCentre();
 
		JLabel texteAttente = new JLabel("Chargement en cours...", JLabel.CENTER);
		texteAttente.setForeground(Color.white);
		texteAttente.setFont(new Font(texteAttente.getFont().getName(), Font.BOLD, 22));
 
		panneauAttente = new JPanel(new GridLayout(3,1));
		panneauAttente.add(new JLabel());
		panneauAttente.add(texteAttente);
		panneauAttente.add(new JLabel());
		panneauAttente.setOpaque(true);
		panneauAttente.setBackground(new Color(0,0,0,100));
		panneauSuperposable.add(panneauAttente);
		panneauAttente.setVisible(false);
	}
 
	/* (non-Javadoc)
	 * @see javax.swing.SwingWorker#doInBackground()
	 */
	@Override
	protected Image[] doInBackground() throws Exception
	{
		panneauAttente.setVisible(true);
		Image[] images = control.afficherMammo(mammo.getNom());
 
		return images;
	}
 
	@Override
	protected void done()
	{
		try
		{
			//[...]
			panneauAttente.setVisible(false);
		} 
		catch (Exception ignore)
		{
			ignore.printStackTrace();
		}
	}
ça marchait plutôt bien, mais au final, j'ai un autre traitement qui lui n'est pas dans un SwingWorker mais pour lequel j'aimerais utiliser le même système.
Donc j'ai sortie la création du panneau transparent du swingWorker pour le mettre lors de la construction de la fenêtre :
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
 
		//Creation d'un panneau qui contiendra le panneauPrincipal et surlequel on pourra
		//ajouter un autre panneau transparent pour faire patienter lors du chargement de l'image
		//(possible grace a l'overlayLayout)
		panneauCentreSuperposable = new JPanel();
		panneauCentreSuperposable.setLayout(new OverlayLayout(panneauCentreSuperposable));
		panneauCentreSuperposable.add(panneauPrincipal);
 
		texteAttente = new JLabel("Analyse en cours...", JLabel.CENTER);
		texteAttente.setForeground(Color.white);
		texteAttente.setFont(new Font(texteAttente.getFont().getName(), Font.BOLD, 22));
 
		panneauAttente = new JPanel(new GridLayout(3,1));
		panneauAttente.add(new JLabel());
		panneauAttente.add(texteAttente);
		panneauAttente.add(new JLabel());
		panneauAttente.setOpaque(true);
		panneauAttente.setBackground(new Color(0,0,0,100));
		panneauCentreSuperposable.add(panneauAttente);
		panneauAttente.setVisible(true);
J'ai mis le setVisible() directement à true pour tester, mais le panneauAttente n'apparait pas. Je ne comprends pas pourquoi ça marchait dans le swingWorker et que ça ne marche plus en dehors...

y'a-t-il une particularité des overlayLayout qui m'échappe?