[JTextArea] redessin qui plante
Bonjour,
j'ai un thread A qui génère des évènements (des strings assez courts)
Code:
fireMyEvent(new MyEvent(new String("abc " + Integer.toString(i) + "\r\n")));
et un thread B qui capte ces évènements. Le thread B comporte un JTextArea complété au fur et à mesure par les messages captés.
Code:
1 2 3
| private synchronized void messageRecuVersEcran(String str) {
ta.setText(ta.getText() + str);
} |
Le pb, c'est que ça plante l'application sans prévenir et sans aucun message.
Lorsque le JTextArea est mis à jour dans le même thread, aucun pb.
Le plantage a lieu aussi avec JTextPane.
J'ai placé un sleep (100) dans le thread qui génère les messages, après chaque message, ça va un peu mieux, sans plus.
Le plantage a lieu après 50 à 200 messages mais jamais au même endroit.
La méthode qui effectue la mise à jour du JTextArea est synchronized et c'est la seule de la classe.
Je n'ai pas d'autre accès au JTextArea pendant la mise à jour.
Si je redimensionne la fenetre qui contient le JTextAreaou la déplace pendant la mise à jour, ça augmente la probabilité de plantage.
Avant, j'avais un pb similaire : je n'utilisais pas les évènements : je passais au thread "générateur" l'instance de ma zone texte pour qu'il fasse lui-même la mise à jour et régulièrement : plantage.
Tout cela me fait penser qu'il s'agit d'une question liée aux threads.
Si qqun a une solution....
Merci
Re: [swing] redessin JTextArea plante
Salut,
Citation:
Envoyé par phil_ma
Le pb, c'est que ça plante l'application sans prévenir et sans aucun message.
Es-tu sur qu'il n'y a vraiment aucun message ?
Sinon le seul problème que je vois vient de l'utilisation de l'opérateur + entre les deux chaines, car il y a création/destruction implicite d'un StringBuffer à chaque fois ce qui peut nuire aux performances...
Il vaut mieux utiliser la méthode append() de JTextArea...
a++
[Résolu][swing] redessin JTextArea plante
Résolu mais ça ne m'arrange pas vraiment....... car c'est un pis-aller
1 InvokeLater bloque le thread jusqu'à la fin de run(), donc pas utilisable dans mon cas.
2 Ai placé un Thread.sleep(200) à la suite du fireMyEvent(...), ce qui permet à la zone texte de se redessiner.
a+