C'est du pinaillage mais dans ton code tu executes des opérations "lentes"
a l'intérieur du thread Swing.
Dans Swing, les evenements générés par l'interface
utilisateur sont reçus par la JVM et stockés dans une file d'evenements. A
l'intérieur de la JVM, un thread d'expedition d'evenements ( implémenté par la
class java.awt.EventQueue) surveille cette file et expédie les évenements
arrivants aux listeners intéressés.
Le thread Swing s'occupe d'afficher les composants graphiques. Si tu effectues
des traitements couteux à l'intérieur de ce thread, tu vas empecher la mise
à jour de l'interface.
( Note : la méthode actionPerformed() ici correspond à ta méthode jButton1ActionPerformed() , le listModel est le modele d'une JList et correspond à ton
composant JTextArea - mais c'est plus explicite avec un listModel )
1. Exemple de ce qu'il *ne faut pas* faire :
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Ici le thead Swing est bloqué pendant 1 seconde, si tu resize la fenetre par exemple, elle ne serait pas repainte .
public void actionPerformed(ActionEvent event) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
for (int i = 0; i < 100; i++) {
val++;
listModel.addElement(new Integer(val));
}
}
2. Exemple de ce qu'il *ne faut pas* faire :
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Ici le travail est bien effectué à l'exterieur du thread Swing, mais le modele de liste n'est pas mis à jour à l'intérieur du thead Swing.
public void actionPerformed(ActionEvent event) {
new Thread(new Runnable() {
public void run() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
for (int i = 0; i < 100; i++) {
val++;
listModel.addElement(new Integer(val));
}
}
}).start();
}
}
3. La bonne manière de procéder
~~~~~~~~~~~~~~~~~~~~~~
- le travail est effectué à l'extérieur du thread Swing
- la mise à jour du composant graphique est effectuée à l'intérieur du thread Swing.
public void actionPerformed(ActionEvent event) {
new Thread(new Runnable() {
public void run() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
SwingUtilities.invokeLater(new Runnable() {
public void run() {
for (int i = 0; i < 100; i++) {
val++;
listModel.addElement(new Integer(val));
}
}
});
}
}).start();
}
# Swing
Posté par Roger Rabbit . En réponse au message Java et Regexp. Évalué à 1.
C'est du pinaillage mais dans ton code tu executes des opérations "lentes"
a l'intérieur du thread Swing.
Dans Swing, les evenements générés par l'interface
utilisateur sont reçus par la JVM et stockés dans une file d'evenements. A
l'intérieur de la JVM, un thread d'expedition d'evenements ( implémenté par la
class java.awt.EventQueue) surveille cette file et expédie les évenements
arrivants aux listeners intéressés.
Le thread Swing s'occupe d'afficher les composants graphiques. Si tu effectues
des traitements couteux à l'intérieur de ce thread, tu vas empecher la mise
à jour de l'interface.
( Note : la méthode actionPerformed() ici correspond à ta méthode jButton1ActionPerformed() , le listModel est le modele d'une JList et correspond à ton
composant JTextArea - mais c'est plus explicite avec un listModel )
1. Exemple de ce qu'il *ne faut pas* faire :
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Ici le thead Swing est bloqué pendant 1 seconde, si tu resize la fenetre par exemple, elle ne serait pas repainte .
public void actionPerformed(ActionEvent event) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
for (int i = 0; i < 100; i++) {
val++;
listModel.addElement(new Integer(val));
}
}
2. Exemple de ce qu'il *ne faut pas* faire :
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Ici le travail est bien effectué à l'exterieur du thread Swing, mais le modele de liste n'est pas mis à jour à l'intérieur du thead Swing.
public void actionPerformed(ActionEvent event) {
new Thread(new Runnable() {
public void run() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
for (int i = 0; i < 100; i++) {
val++;
listModel.addElement(new Integer(val));
}
}
}).start();
}
}
3. La bonne manière de procéder
~~~~~~~~~~~~~~~~~~~~~~
- le travail est effectué à l'extérieur du thread Swing
- la mise à jour du composant graphique est effectuée à l'intérieur du thread Swing.
public void actionPerformed(ActionEvent event) {
new Thread(new Runnable() {
public void run() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
SwingUtilities.invokeLater(new Runnable() {
public void run() {
for (int i = 0; i < 100; i++) {
val++;
listModel.addElement(new Integer(val));
}
}
});
}
}).start();
}
Références
~~~~~~~
Le threading dans Swing :
http://java.sun.com/products/jfc/tsc/articles/threads/threads1.html(...)
Les exemples de code et plus d'explication :
http://www.clientjava.com/blog/2004/08/20/1093059428000.html(...)