Thread et gestion de l'affichage

UnderFlow Messages postés 34 Date d'inscription jeudi 9 juin 2005 Statut Membre Dernière intervention 6 juin 2006 - 6 juin 2006 à 15:10
UnderFlow Messages postés 34 Date d'inscription jeudi 9 juin 2005 Statut Membre Dernière intervention 6 juin 2006 - 6 juin 2006 à 15:50
Bonjour à tous,

Je rencontre actuellement un problème qui m'énerve énooooormément.

L'énoncé en lui-même est un peu long, mais le problème tout simple et classique j'en suis sûr (même si je n'ai pas réussi à trouver de soluce sur codes sources);
Donc voilà, durant l'exécution de mon programme principal (java 5), j'appelle une méthode qui se décompose comme ceci :

private void maMethode(){

execution1();
execution2();
etc...

}

avec les méthodes execution1,2,3 qui fonctionnent très bien (pas de bloquage ni de boucle infinie).
Cependant, il se trouve que maMethode() prend un certain temps à s'éxécuter (temps des méthodes exécutions quelques fois complexes).

Je voulais donc créer une petite fenêtre sympathique qui indiquerait simplement sous forme de texte l'état d'avancement de la méthode.
Ex : "Etape 2/X : execution2 en cours ...".

Ok... pour cela, je mets en place une classe A que voici :

public class A extends JPanel implements ActionListener{

private static String textContent = "";
private JTextArea text = new JTextArea(textContent);

public A(){
text.setEditable(false);
add(text);

Timer tm = new Timer(1000,this);
tm.start();
}

public static void setText(String text){
textContent = text;
}

public void actionPerformed(ActionEvent ev) {
text.setText(textContent);
repaint();
}

public static void createAndShowGUI() {
//Make sure we have nice window decorations.
JFrame.setDefaultLookAndFeelDecorated(true);

//Create and set up the window.
JFrame frame = new JFrame("ATTENTE");
frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
frame.setResizable(false);

//Create and set up the content pane.
JComponent newContentPane = new ProgressionRapport();
newContentPane.setOpaque(true); //content panes must be opaque
frame.setContentPane(newContentPane);

//Display the window.
frame.pack();
frame.setVisible(true);
}
}

fortement inspirée de la classe tutoriale de Sun.

et maMethode devient :

private void maMethode(){

new Thread(new Runnable() {
public void run() {
A.createAndShowGUI();
}
}).start();

A.setText("Etape 1/X : execution1 en cours...");
execution1();
A.setText("Etape 2/X : execution2 en cours...");
execution2();
etc...

}

Mais rien n'y fait !!!
J'ai beau essayer de toutes les façons, la fenêtre ATTENTE apparait bien au lancement de maMethode, mais son contenu reste VIDE (on ne voit que le fond de frame) et il ne se raffraichit pas jusqu'à ce que maMethode s'achève entièrement (après le dernier executionX() )!!!!

Comment faire ???
AIDEZ MOI SVP !!!!!

MERCI MILLE FOIS D'AVANCE !!!

3 réponses

UnderFlow Messages postés 34 Date d'inscription jeudi 9 juin 2005 Statut Membre Dernière intervention 6 juin 2006
6 juin 2006 à 15:11
Bonjour à tous,

Je rencontre actuellement un problème qui m'énerve énooooormément.

L'énoncé en lui-même est un peu long, mais le problème tout simple et classique j'en suis sûr (même si je n'ai pas réussi à trouver de soluce sur codes sources);
Donc voilà, durant l'exécution de mon programme principal (java 5), j'appelle une méthode qui se décompose comme ceci :

private void maMethode(){

execution1();
execution2();
etc...

}

avec les méthodes execution1,2,3 qui fonctionnent très bien (pas de bloquage ni de boucle infinie).
Cependant, il se trouve que maMethode() prend un certain temps à s'éxécuter (temps des méthodes exécutions quelques fois complexes).

Je voulais donc créer une petite fenêtre sympathique qui indiquerait simplement sous forme de texte l'état d'avancement de la méthode.
Ex : "Etape 2/X : execution2 en cours ...".

Ok... pour cela, je mets en place une classe A que voici :

public class A extends JPanel implements ActionListener{

private static String textContent = "";
private JTextArea text = new JTextArea(textContent);

public A(){
text.setEditable(false);
add(text);

Timer tm = new Timer(1000,this);
tm.start();
}

public static void setText(String text){
textContent = text;
}

public void actionPerformed(ActionEvent ev) {
text.setText(textContent);
repaint();
}

public static void createAndShowGUI() {
//Make sure we have nice window decorations.
JFrame.setDefaultLookAndFeelDecorated(true);

//Create and set up the window.
JFrame frame = new JFrame("ATTENTE");
frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
frame.setResizable(false);

//Create and set up the content pane.
JComponent newContentPane = new ProgressionRapport();
newContentPane.setOpaque(true); //content panes must be opaque
frame.setContentPane(newContentPane);

//Display the window.
frame.pack();
frame.setVisible(true);
}
}

fortement inspirée de la classe tutoriale de Sun.

et maMethode devient :

private void maMethode(){

new Thread(new Runnable() {
public void run() {
A.createAndShowGUI();
}
}).start();

A.setText("Etape 1/X : execution1 en cours...");
execution1();
A.setText("Etape 2/X : execution2 en cours...");
execution2();
etc...

}

Mais rien n'y fait !!!
J'ai beau essayer de toutes les façons, la fenêtre ATTENTE apparait bien au lancement de maMethode, mais son contenu reste VIDE (on ne voit que le fond de frame) et il ne se raffraichit pas jusqu'à ce que maMethode s'achève entièrement (après le dernier executionX() )!!!!

Comment faire ???
AIDEZ MOI SVP !!!!!

MERCI MILLE FOIS D'AVANCE !!!
0
scaryman Messages postés 492 Date d'inscription vendredi 30 janvier 2004 Statut Membre Dernière intervention 16 mai 2007 12
6 juin 2006 à 15:40
Salut
A mon avis, ça doit être un problème de synchronisation entre les threads.
Essaie plutot de faire en sorte que ce soit le thread qui s'occupe de la fenêtre qui mette à jour le textarea (au moyen d'une méthode par exemple).

A++
0
UnderFlow Messages postés 34 Date d'inscription jeudi 9 juin 2005 Statut Membre Dernière intervention 6 juin 2006
6 juin 2006 à 15:50
Merci pour la réponse mais ...
Je ne sais pas si le problème vient de là car avant d'avoir une version threadée, j'avais un truc du genre :

private void maMethode(){

JFrame jfTmp = new JFrame("ATTENTE");
JTextArea text = new JTextArea("Initialisation ...");
jfTmp.add(text);
jfTmp.setVisible(true);

text.setText("Etape 1/X : execution1 en cours ...");
jfTmp.repaint();
execution1();
text.setText("Etape 2/X : execution2 en cours ...");
jfTmp.repaint();
etc ...
}

Donc quelquechose de pas multi-threadé et où la fenêtre et le textArea (j'ai essayé repaint() sur tout) sont mis à jour par le programme principal lui-même, mais je rencontre exactement le même prob !! :
fenêtre ATTENTE qui apparait mais ne contient rien et ne se raffraichit pas !

HELP SVP !!!!
0
Rejoignez-nous