2009-06-25 3 views
3

Je développe une application Swing, et tout fonctionne normalement. Mais j'ai un problème d'interface graphique.Problème d'application Swing

Lorsque j'exécute l'application, et par exemple de minimiser une autre fenêtre, mon application fonctionne toujours, mais la partie centrale de JFrame est invisible ou masquée. Après avoir terminé une partie de la logique du programme, l'interface graphique repeint et est à nouveau visible. Cela continuera jusqu'à ce que le programme se termine.

Y at-il une API pour empêcher ce comportement, ou une classe pour forcer l'interface graphique visible, ou peut-être ajouter une barre de progression?

Si quelqu'un a besoin de cette information, je la teste sur Windows Vista, avec java 1.6.

Répondre

9

Il me semble que vous effectuez une sorte d'E/S lente ou des calculs qui provoquent l'absence de réponse de votre interface graphique.

Ce que vous devez faire est de faire les longs processus dans un autre thread.

La méthode standard consiste à utiliser une classe SwingWorker.

Les Java tutorials ont d'excellentes ressources et des didacticiels sur la façon d'utiliser correctement le SwingWorker.

Here et here est un lien vers une autre question que je crois peut être similaire.

Ce comportement que vous voyez est le résultat de votre processus de longue durée bloquant le thread que l'interface graphique utilise pour se repeindre. Ainsi, pendant que votre tâche est en cours, l'interface graphique est incapable de repeindre votre JFrame et il ne répond plus.

+0

Dans certains cas, Swing oublie de se repeindre lorsque la fenêtre est sale sous Windows. Avoir une minuterie d'oscillation toutes les deux secondes et émettre un repaint() à la fenêtre. – akarnokd

+0

Lorsqu'une fenêtre est réactivée (reprend le focus), elle se repeint par défaut. – jjnguy

+0

Ajout d'une minuterie peut aider, mais l'interface graphique ne peut pas se repeindre si le fil est bloqué. – jjnguy

2

Tout comme jinguy dit que vous faites très probablement une tâche qui prend beaucoup de temps à terminer et qui doit être mise dans un fil de discussion. Jetez un oeil à la Tutorial Java Sun Concurrency in Swing pour plus d'informations sur la façon de le faire correctement.

2

Il semble que vous ayez besoin de réaliser vos opérations commerciales de longue durée dans un fil séparé. Je vous suggère d'utiliser un SwingWorker.

Cochez cette case simple example.