Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[swing - debutant] invokeLater

3 réponses
Avatar
mei
Bonsoir,
Au détour de mes lectures sur les threads, je suis tombée sur les
méthodes invokeLater() et invokeAndWait() de la classe SwingUtilities.
Ainsi, je me rends compte que tous les programmes que j'ai pu écrire en
swing était erroné (moindre mal car c'était juste pour l'école, et pas
pour de la production ;)):
Supposons:
public class Main {
public static void main(String[] argv){
MaFenetre f = new MaFenetre();
f.setVisible(true);
}
}

class MaFenetre extends JFrame {
MaFenetre() {
// ajout des composants dans le container + listeners
}
}

Puisque le code du constructeur MaFenetre() agit sur les composants
swing, il doit donc être exécuté dans l'EDT plutôt que dans le thread
principal, et on devrait donc écrire la méthode main ainsi :
public static void main(String[] argv){
SwingUtilities.invokeLater(new Runnable() {
public void run() {
MaFenetre f = new MaFenetre();
f.setVisible(true);
}
});
}
Peut-on me confirmer que la 2nde version est bien la bonne? Et si oui,
concrètement, quels risques y a-t-il avec la 1ere version?
Merci d'avance,
Mei.

3 réponses

Avatar
Raphael Tagliani
Regarde la doc sur SwingWorker, c'est un peu plus simple à utiliser, et
ça fait la même chose.
Tu peux avoir une explication complète dans le 'java swing tutorial' si
tu veux connaître les détails.
En gros, l'un des effets de bords très courant, c'est de cliquer sur un
bouton et de devoir attendre le retour d'une action pour pouvoir
intéragir avec le reste de l'appli. D'autres effets sont plus gênants,
ils sont décrits dans le tuto de sun.

Bonsoir,
Au détour de mes lectures sur les threads, je suis tombée sur les
méthodes invokeLater() et invokeAndWait() de la classe SwingUtilities.
Ainsi, je me rends compte que tous les programmes que j'ai pu écrire en
swing était erroné (moindre mal car c'était juste pour l'école, et pas
pour de la production ;)):
Supposons:
public class Main {
public static void main(String[] argv){
MaFenetre f = new MaFenetre();
f.setVisible(true);
}
}

class MaFenetre extends JFrame {
MaFenetre() {
// ajout des composants dans le container + listeners
}
}

Puisque le code du constructeur MaFenetre() agit sur les composants
swing, il doit donc être exécuté dans l'EDT plutôt que dans le thread
principal, et on devrait donc écrire la méthode main ainsi :
public static void main(String[] argv){
SwingUtilities.invokeLater(new Runnable() {
public void run() {
MaFenetre f = new MaFenetre();
f.setVisible(true);
}
});
}
Peut-on me confirmer que la 2nde version est bien la bonne? Et si oui,
concrètement, quels risques y a-t-il avec la 1ere version?
Merci d'avance,
Mei.


Avatar
mei
Regarde la doc sur SwingWorker, c'est un peu plus simple à utiliser, et
ça fait la même chose.
Tu peux avoir une explication complète dans le 'java swing tutorial' si
tu veux connaître les détails.


Dans ce tutorial, ils parlent de 3 types de thread: le thread principal
(qui lance l'application), l'EDT et les threads en background (ou worker
thread) pour les tâches longues. Il semble que SwingWorker s'utilise
pour les worker threads.
Dans mon exemple, je parle plus de l'interaction entre le thread
principal et l'EDT. Donc je ne suis pas sure que ce soit le meme
probleme, si?

En gros, l'un des effets de bords très courant, c'est de cliquer sur un
bouton et de devoir attendre le retour d'une action pour pouvoir
intéragir avec le reste de l'appli. D'autres effets sont plus gênants,
ils sont décrits dans le tuto de sun.


Je ne les ai pas encore vus, mais c'est vrai que je n'ai pas encore fini
la lecture du tutorial ;)

Avatar
jlp

Regarde la doc sur SwingWorker, c'est un peu plus simple à utiliser, et
ça fait la même chose.
Tu peux avoir une explication complète dans le 'java swing tutorial' si
tu veux connaître les détails.



Dans ce tutorial, ils parlent de 3 types de thread: le thread principal
(qui lance l'application), l'EDT et les threads en background (ou worker
thread) pour les tâches longues. Il semble que SwingWorker s'utilise
pour les worker threads.
Dans mon exemple, je parle plus de l'interaction entre le thread
principal et l'EDT. Donc je ne suis pas sure que ce soit le meme
probleme, si?

En gros, l'un des effets de bords très courant, c'est de cliquer sur un
bouton et de devoir attendre le retour d'une action pour pouvoir
intéragir avec le reste de l'appli. D'autres effets sont plus gênants,
ils sont décrits dans le tuto de sun.



Je ne les ai pas encore vus, mais c'est vrai que je n'ai pas encore fini
la lecture du tutorial ;)
Voir cet article


http://gfx.developpez.com/tutoriel/java/swing/swing-threading/