2009-05-13 11 views
3

Je souhaite créer un nouveau thread d'envoi d'événement dans Swing, et j'ai des difficultés à trouver des références en ligne pour savoir comment procéder. J'ai fait cela dans .NET en créant un nouveau thread et en appelant Application.run (...). Est-ce que quelqu'un a fait ça? Est-ce possible dans Swing?Plusieurs threads d'envoi d'événement Swing

FYI la raison pour laquelle j'essaye de faire ceci est parce que j'écris un plug-in Eclipse, et je voudrais faire apparaître des boîtes de dialogue qui ne sont pas modales à l'IDE mais qui sont modales (bloquantes) à ma logique d'IU . Je pourrais accomplir cela en utilisant des dialogues non-modaux et des rappels, mais cela nécessite le surcoût de rendre mon code multithread. Je reviendrai à cela si le premier n'est pas possible.

+0

Est-ce que SWT utilise le Swing EDT? –

+0

@mmyers: À ma connaissance, non. – Powerlord

+0

FYI mes boîtes de dialogue Swing DO bloquent l'IDE – dcstraw

Répondre

5

Oui, c'est possible. J'ai fait une telle logique de threads d'expédition EDT multiple dans Swing. Cependant, le résultat net était que cela ne fonctionnait pas de manière fiable.

(a) Tous les JVMs ne fonctionnent pas bien avec plusieurs threads EDT (problèmes de synchronisation de rendu des graphiques logique en code natif et tel, IBM JVM a échoué avec plusieurs threads EDT, Sun JVM & JVM d'Apple a fait un travail)

(b) La logique de rendu Swing a quelques bogues provoquant des erreurs de rendu aléatoires (par exemple, http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6727829). Quoi qu'il en soit, cela nécessite essentiellement l'établissement de deux AppContexts, qui ont chacun leur propre thread EDT.

4

Je suis un peu confus par votre question, parce que vous mentionnez Swing, mais dites que vous écrivez un plugin Eclipse. Puisque la question est étiquetée Swing, je vais donner une réponse Swing (mais affichée en CW).

Il existe un thread d'envoi d'événement. Il y a toujours un thread d'envoi d'événement, à moins qu'il n'y en ait aucun. Vous ne pouvez pas en créer un autre.

Vous pouvez toutefois modifier le ModalityType de vos boîtes de dialogue ou modifier le ModalExclusionType d'une fenêtre. Dans ce cas, si vous étiez en train d'écrire tout cela vous-même, vous définiriez la fenêtre de votre niveau supérieur ModalExclusionType à APPLICATION_EXCLUDE. Mais encore une fois, je ne vois pas comment cela pourrait vous aider, puisque Eclipse utilise SWT au lieu de Swing.

+0

Il semble que SWT utilise un système de modalité similaire, ce qui pourrait vous mettre sur la bonne voie. Mais je ne suis pas assez familier pour l'expliquer en détail. –

+0

En fait, le PlugIn et le WebStart ont plusieurs EDT. Cependant, l'API n'est pas publique et vous ne pouvez pas mélanger des composants ensemble. –

+0

Je dois admettre que je n'avais pas réalisé qu'Eclipse était écrit en SWT, même si c'est logique. Je suis relativement nouveau à Java, avec mon fond étant principalement .NET. Je sais cependant que je peux créer et afficher des dialogues Swing à partir de mon plug-in Eclipse. – dcstraw

2

Je vais jeter ma dernière réponse et recommencer à zéro.

Dans SWT, vous pouvez créer Shell s (fenêtres) ou Dialog personnalisés qui sont modaux uniquement au parent en transmettant l'indicateur de style SWT.PRIMARY_MODAL lors de la création.

Notez que Dialog est une classe abstraite, vous devez donc créer la vôtre. C'est probablement juste plus facile à utiliser Shell.

Éditer:

Pourquoi SWT? Parce que c'est ce qu'utilise Eclipse. Voir: Eclipse Platform Plug-in Developer Guide (PDF zippé) pour plus de détails. La version la plus récente est disponible dans le système d'aide d'Eclipse (Aide> Contenu de l'aide> Guide d'environnement de développement de plug-in.)

+0

Merci pour la suggestion. Il n'a pas fait ce dont j'ai besoin cependant. J'aurais besoin d'un type de modalité qui soit essentiellement modal, même pour le parent direct, tout en bloquant l'appel à open(). – dcstraw