2011-04-17 4 views
1

J'ai un composant simple de JTabbedPane avec deux onglets. Lorsqu'un événement de bouton est tiré sur l'un des onglets, je veux la vue actuelle à définir à l'autre onglet immédiatement. Je peux obtenir avec succès l'onglet en cours à l'aide de setSelectedIndex (int) dans la méthode actionPerformed du bouton en question, mais la fonctionnalité restante de l'événement button peut parfois prendre un certain temps à se terminer.Java JTabbedPane onglet Commutateur immédiatement

Il semblerait que la modification setSelectedIndex (int) ne se produise pas immédiatement, et ne se produit que lorsque le corps de la méthode actionPerformed qui a été déclenchée par le bouton click/press est terminé. La raison pour laquelle je veux changer d'onglet lorsque je clique sur le bouton est que l'utilisateur peut voir un message dans une zone de texte de l'autre onglet en leur disant "traitement, veuillez patienter", etc., tandis que le reste de la fonctionnalité de clic sur le bouton est effectuée. Les résultats de cette fonctionnalité, lorsqu'ils arriveront, remplaceront le message "... please wait".

Alors qu'est-ce qui se passe maintenant est que je clique sur le bouton, il se fige sur cet onglet jusqu'à ce que la fonctionnalité du bouton a terminé entièrement, devenant ensuite. Donc, le message "... please wait" n'est jamais vu.

Je ne sais pas quoi faire. Créez un nouveau thread pour la "fonctionnalité", peut-être, et laissez le bouton cliquer sur l'événement déclencher le thread afin que l'événement de bouton peut finir et passer les onglets en attendant les résultats. Juste à voix haute. Toute aide est appréciée.

-Rob

+0

ce que vous voulez sans doute faire est en fait quelque chose de différent: si vous pensez et si vous regardez des applications complexes (comme IDEs), vous remarquerez qu'ils ne se soucient généralement pas avec * « S'il vous plaît attendre » * messages intégrés dans chaque onglet/sous-onglet/sous-écran/quoi que ce soit de l'application. Qu'est-ce qu'ils font est de mettre une barre de progression qui peut être vu de ** tout ** partie de l'application et mettre à jour cette barre de progression de la «partie» de l'application dans laquelle l'utilisateur se trouve. * de chaque page chargée toujours au même endroit. Un design beaucoup plus agréable à mon avis. – SyntaxT3rr0r

+0

Une barre de progression serait formidable, mais je suis un peu pressé avec cela, et je n'aurais certainement pas le temps pour la mise en place du suivi du temps restant. Je comprends ce que vous voulez dire, cependant, quand vous dites simplement mettre le message dans une zone universelle de l'application, je pourrais le considérer. – Rob

Répondre

2

Il me semble que si vous avez un problème de filetage plus que tout, que ce gèle votre interface graphique rendant complètement insensible jusqu'à ce qu'elle se termine, et retarder ainsi votre échange de fenêtre à onglets. Si vous exécutez des processus de longue durée dans votre méthode d'action effectuée, faites-les à la place dans un thread d'arrière-plan tel que fourni par un SwingWorker, puis votre interface graphique deviendra plus réactive.

Pour plus de détails à ce sujet, s'il vous plaît consulter ce tutoriel: Concurrency in Swing

Si malgré ces conseils, vous avez toujours des problèmes, alors vous allez probablement avoir à poster une partie de votre code incriminé. Le mieux serait si vous pouviez créer une petite application compilable et exécutable qui reproduit le problème, un SSCCE.

¡Que tengas suerte!

+0

+1, comprendre l'EDT et la règle du thread unique est l'un des concepts les plus importants de l'apprentissage Swing. Un lien tutoriel est toujours important pour cela. Je – camickr

+0

finalement obtenu ce travail en utilisant invokeLater (nouveau Runnable {etc .. dans la méthode actionPerformed. Je regarder de plus près à l'EDT, mais, juste pour que j'ai une meilleure compréhension de ce qui se passe. – Rob

+0

Après avoir lu un peu plus sur l'EDT et SwingWorker, il semble que vous aviez raison, et que SwingWorker est vraiment la voie à suivre pour toutes les tâches en arrière-plan qui peuvent prendre du temps pour terminer. Le GUI reste maintenant aussi réactif qu'il devrait l'être. Merci. – Rob

Questions connexes