Comment éliminer SWT Coquilles (et les boîtes de dialogue)?
Quelle est la meilleure façon de disposer de SWT Coquilles? J'ai créé quelques Dialogues avec succès, suivant le modèle donné dans la boîte de Dialogue de l'API docs. Le SWT API pour boîte de Dialogue indique:
Le modèle de base pour un définis par l'utilisateur boîte de dialogue ressemble généralement quelque chose
comme ceci:public class MyDialog extends Dialog { Object result; public MyDialog (Shell parent, int style) { super (parent, style); } public MyDialog (Shell parent) { this (parent, 0); //your default style bits go here (not the Shell's style bits) } public Object open () { Shell parent = getParent(); Shell shell = new Shell(parent, SWT.DIALOG_TRIM | SWT.APPLICATION_MODAL); shell.setText(getText()); //Your code goes here (widget creation, set result, etc). shell.open(); Display display = parent.getDisplay(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) display.sleep(); } return result; } }
Les Dialogues, j'ai créé ne pas ont leur propre icône de barre des tâches sous Windows, que je m'attends pour un Dialogue. Je veux maintenant créer quelques Coquilles, qui, si je comprends bien sera reçoivent leur propre barre des tâches sous Windows?
Contrairement aux indications données dans l'API ci-dessus docs, j'ai également vu un article qui semble suggérer que le fait d'avoir une boucle while, comme indiqué dans les docs de l'API est la mauvaise façon de le faire. L'article suggère plutôt de l'élimination de la Coquille à l'aide de la proximité de l'écouteur d'événement.
Quelle est la bonne façon de disposer du SWT Coquilles (et tout était sur le thème, les boîtes de dialogue)?
OriginalL'auteur Buttons840 | 2011-12-21
Vous devez vous connecter pour publier un commentaire.
J'espère pouvoir aider à expliquer ce qui se passe ici.
Dialog
s'agit essentiellement d'une pratique de classe à la sous-classe, parce queShell
lui-même n'est pas censé être sous-classé. Vous pouvez créer des coquilles sans l'aide deDialog
à tous, si vous le souhaitez. Dans ce cas, votreMyDialog
classe est une classe que d'autres peuvent utiliser pour ouvrir le même type de dialogue à plusieurs reprises.Ce morceau de code des lecteurs de la SWT cas de la boucle tant que la coquille est ouverte (en cliquant sur le bouton de fermeture sur la coque dispose le shell par défaut):
Vous devez appeler
Display.readAndDispatch
régulièrement afin de maintenir votre SWT application de "verrouillage". Fondamentalement, il s'entraîne tous les événements entrants à partir du système d'exploitation (évènements souris et clavier, repeindre les événements, etc.) pour être correctement traitées par votre application.readAndDispatch
prend essentiellement en un événement à partir de l'application de la file d'attente d'événements et invoque le bon auditeurs. Dans une application Eclipse RCP, l'établi est normalement responsable de "pomper" de la boucle d'événement et vous n'avez pas à jouer avec ça. Voici un peu plus d'infos sur la boucle d'événements.Le but de "manuellement" le pompage de la boucle d'événements dans ce contexte est de prévenir les
MyDialog.open
de retour alors que la coquille n'est pas disposé, mais toujours garder à l'application de la "pendaison". Si votreMyDialog.open
méthode essayé d'attendre pour le shell pour être éliminés, mais il n'a pas de pompe de la boucle d'événements, votre demande de "lock-up", car sans la boucle d'événement en cours d'exécution, il n'y a aucun moyen pour le shell pour toujours être informé qu'il doit être éliminé!Vous peut créer des coquilles sans l'aide de ce modèle. Voici un exemple très simple SWT application qui ouvre une tonne de coquilles tout à la fois et continue de fonctionner tant qu'au moins l'un d'entre eux est toujours ouverte (j'ai omis la déclaration du package et les importations):
Remarque que j'ajoute un
DisposeListener
à la coque afin que je puisse prendre des mesures lorsque la coquille est fermée. Vous pouvez également utiliserIShellListener
à écouter davantage directement pour la clôture de l'événement, et même l'empêcher (que vous pouvez faire si l'enveloppe contient le travail non enregistré, par exemple). Voici un ennuyeux modification du premier programme qui démarre à 5 de coquilles et de hasard ne vous empêche de les fermer:J'espère que cela a aidé à rendre les choses plus claires!
Modifiées afin d'ajouter: je ne suis pas totalement sûr de savoir pourquoi vous n'obtenez pas une barre des tâches de windows élément de votre shell, mais je soupçonne qu'il a quelque chose à voir avec le style des indicateurs que vous êtes de passage dans la coque du constructeur. Les coquilles dans mon exemple n'ont aucun style et de drapeaux, ils ont tous une icône de barre des tâches.
OriginalL'auteur Mike Daniels