1

Bonjour,
Je cherche à faire apparaitre et disparaitre une fenetre popup pendant le déroulement de mon algorithme. J'ai écrit une classe AttenteFrame que voici :


public class AttenteFrame
{
	private static JLabel texte;
	private static JFrame cadre;
 
	public AttenteFrame(String string) 
	{
 
		cadre = new JFrame("En cours de chargement");
		JPanel panneau = new JPanel();
		panneau.setLayout(new BorderLayout());
		panneau.setSize(250,70);
		panneau.setBackground(Color.RED);
		texte = new JLabel(string);
		texte.setText(string);
		panneau.add(texte, BorderLayout.CENTER); 
		cadre.getContentPane().add(panneau, BorderLayout.CENTER);
		cadre.setSize(275,85);
		cadre.setResizable(false);
		java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
		cadre.setLocationRelativeTo( null ) ;
		cadre.setVisible(true);
	}
 
	public void setText(String string){
		texte.setText(string);
	}
 
	public void dispose()
	{
		cadre.dispose();
	}
}


A n'importe quel moment de mon algo, je veux pouvoir créer, afficher et faire disparaitre une instance d'AttenteFrame.

Probleme : L'instance se créé bien, mais apparement rien à l'interieur: ni le texte dans mon JLabel, ni la couleur de mon JPanel. La frame semble vide...

Pourriez vous m'aider ?

2

Je pense que la JFrame n'est pas réellement vide mais que son contenu ne doit pas pouvoir être rafraichi pendant le déroulement de ton agorithme.

Une solution serait de forcer a redessinner régulièrement pendant ton algorithme, ou plus simplement que tu crée/ouvres ta fenetre depuis un autre Thread.
avatar

3

OK, en effet, en ouvrant mon algorithme avec un thread tout marche bien , jte remercie beaucoup

4

Attention, dans le cas où ton nouveau thread a besoin d'effectuer des opérations Swing, c'est une situation dangereuse, l'API Swing n'est pas thread-safe.
Il est nécessaire de demander l'exécution de ces opérations avec SwingUtilities.invokeLater(), dans l'event dispatching thread (seul thread abilité à appeler l'API Swing).

5

ça ne suffit pas de synchroniser sa méthode "public void setText(String string)" ?

6

C'est un peu plus compliqué que ca. En fait les appel a Swing sont sencés ce dérouler dans un thread spécial.
L'article http://rom.developpez.com/java-swingworker/ explique plutôt bien le problème et présente la classe Swingworker qui peut-ête une alternative à SwingUtilities.invokeLater(). Cela me semble tout à fait appropriée dans son cas, s'il peut se permettre d'utiliser un JDK récentrécente(JDK1.6) .
avatar

7

merci, je lirai ça plus tard smile