OVH Cloud OVH Cloud

Swing et Thread bloquand ?

6 réponses
Avatar
FloG
Bonjour,

Cet exemple est censé afficher un JTextField où s'affiche un compteur,
tout en laissant la main à d'autres processus.

Un bout de code valant mieux que dix milles mots :

import javax.swing.*;
import java.awt.*;
import java.lang.Thread;
import javax.swing.SwingUtilities;

public class Main {
JFrame main;
JTextArea text;
JScrollPane scroll;
Thread thread;
int count;

public Main() {
thread = new Thread() {
public void run() {
while (true) {
text.setText(count+"");
count++;
try {
thread.sleep(1000);
}
catch (InterruptedException e) {
System.out.println(e.getMessage());
}
}
}
};

frameIt();

thread.run();

// ce hello ne s'affichera pas :-(
System.out.println("HELLO\n");
}

public void frameIt() {
main = new JFrame();
text = new JTextArea();
scroll = new JScrollPane();
main.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
scroll.getViewport().add(text);
main.getContentPane().add(scroll);
main.setVisible(true);
main.pack();
}

public static void main(String[] arg) {
new Main();
}
}

voila,
mais je ne comprends pas pourquoi mon Thread ne laisse pas s'executer la
suite du programme (en l'occurence, l'affichage de "hello") comme il
serait censé le faire (?)

d'avance merci pour vos reponse.
Florent.

6 réponses

Avatar
FloG
Willy wrote:
thread.run();



thread.start();


lol, c'est pas vrai, j'ai passé 3 heures dessus

desole pour cette question :/

Florent


Avatar
Willy
lol, c'est pas vrai, j'ai passé 3 heures dessus
desole pour cette question :/


Gaffe qd même, normalement seule la Thread principale (celle de "main") a le
droit de modifier les composants Swing.

Ce qui risque de te poser des problèmes plus tard.
Sur une grosse appli s'entend, si c'est juste pour se faire plaisir, pas
besoin de se prendre la tête !

@+
Willy

Avatar
FloG
Gaffe qd même, normalement seule la Thread principale (celle de "main") a le
droit de modifier les composants Swing.

Ce qui risque de te poser des problèmes plus tard.
Sur une grosse appli s'entend, si c'est juste pour se faire plaisir, pas
besoin de se prendre la tête !


oui, j'avais deja vu ca
mais je n'ai jamais encore eu de probleme jusqu'ici tant que j'ai un
seul Thread accedant à une JFrame et ses widgets (jusqu'ici).

Avatar
Willy
thread.run();


thread.start();

Avatar
Frédéric Augé
FloG wrote:
Gaffe qd même, normalement seule la Thread principale (celle de
"main") a le
droit de modifier les composants Swing.

Ce qui risque de te poser des problèmes plus tard.
Sur une grosse appli s'entend, si c'est juste pour se faire plaisir, pas
besoin de se prendre la tête !



oui, j'avais deja vu ca
mais je n'ai jamais encore eu de probleme jusqu'ici tant que j'ai un
seul Thread accedant à une JFrame et ses widgets (jusqu'ici).


les problèmes de deadlocks sont très difficiles à reproduire, alors

mieux vaut prévenir et faire les choses bien, ça ne coûte pas plus
http://java.sun.com/docs/books/tutorial/uiswing/misc/threads.html


Avatar
FloG
Gaffe qd même, normalement seule la Thread principale (celle de
"main") a le
droit de modifier les composants Swing.

Ce qui risque de te poser des problèmes plus tard.
Sur une grosse appli s'entend, si c'est juste pour se faire plaisir, pas
besoin de se prendre la tête !




oui, j'avais deja vu ca
mais je n'ai jamais encore eu de probleme jusqu'ici tant que j'ai un
seul Thread accedant à une JFrame et ses widgets (jusqu'ici).


les problèmes de deadlocks sont très difficiles à reproduire, alors

mieux vaut prévenir et faire les choses bien, ça ne coûte pas plus
http://java.sun.com/docs/books/tutorial/uiswing/misc/threads.html


oui, en reflechissant , c'est clair comme de l'eau de roche !!!
et j'ai bien peur de devoir revoir toute la conception de mon appli pour
lui assurer une bonne stabilité :-(

Il ne me reste plus qu'a prendre mon courage à deux mains :-/