2010-03-05 3 views
3

J'ai une application SWT qui ouvre une fenêtre OpenGL (en utilisant la bibliothèque LWJGL) après avoir appuyé sur un bouton. Il est supposé fermer sa fenêtre SWT principale et en ouvrir une nouvelle avec un contexte OpenGL. Fonctionne très bien sur Windows. Sur Mac, je reçois cette erreur:Ouverture d'une fenêtre LWJGL à partir d'une application SWT sur Mac

2010-03-05 02:28:25.315 java[1315:a07] [Java CocoaComponent compatibility mode]: Enabled 
2010-03-05 02:28:25.316 java[1315:a07] [Java CocoaComponent compatibility mode]: Setting timeout for SWT to 0.100000 
2010-03-05 02:28:25.317 java[1315:a07] Apple AWT Startup Exception : _createMenuRef called with existing principal MenuRef already associated with menu 
2010-03-05 02:28:25.318 java[1315:a07] Apple AWT Restarting Native Event Thread 

La fenêtre SWT ferme puis se bloque app, sans fenêtres ouvertes.

Il semblerait que l'application SWT ne se ferme pas proprement et laisse ses entrées de menu associées, ce qui empêche l'ouverture de la fenêtre LWJGL. Mac OS X ne veut qu'un seul menu d'application. SWT ne libère pas son propre menu et LWJGL veut en ajouter un autre.

faits:

  • Un bouton dans la boîte de dialogue SWT est censé fermer la boîte de dialogue et d'ouvrir une fenêtre de LWJGL (org.lwjgl.opengl.Display). Le bouton définit une variable statique dans l'application pour lui indiquer la procédure à suivre après la fermeture de la fenêtre SWT, de sorte que la fenêtre LWJGL n'est pas ouverte directement à partir d'un rappel SWT.

  • Le bouton ferme ensuite la fenêtre SWT. Je ne connais pas la bonne façon de le faire mais j'ai essayé différentes combinaisons de shell.close, shell.dispose, display.close et display.dispose, aucune d'entre elles n'a fonctionné. Ils ferment tous la fenêtre mais l'erreur se produit à chaque fois.

Est-ce que quelqu'un sait ce qui pourrait être fait pour que cela fonctionne?

MISE À JOUR: Cela ne fonctionne tout simplement pas et il semble que Apple ne le résoudra jamais. Le seul moyen de contourner le problème est de lancer une nouvelle instance d'application et de lui transmettre un paramètre lui indiquant d'ouvrir la seconde fenêtre.

MISE À JOUR 2: Dans ce cas particulier, je résolu le problème en utilisant la boîte de dialogue de SWT pour la version Windows de l'application et pour la version Mac, j'ai écrit un natif de dialogue de cacao qui invoque la machine virtuelle Java et exécute le LWJGL application en cas de besoin. Cela fonctionne plutôt bien.

Répondre

1

Il me semble que le problème n'est pas SWT créant une nouvelle fenêtre ou LWJGL faisant ainsi. Je crois que le problème réside dans le fait que sous Mac, le menu des applications doit être enregistré dans le processus, et pour une raison ou une autre, il y a un conflit d'intérêts entre les deux.

Vous pourriez avoir des meilleures choses de jonglerie chance autour d'un peu:

  • Qu'est-ce qui se passe lorsque vous créez une fenêtre LWJGL d'abord, puis DEVENEZ shell SWT? Que se passe-t-il lorsque vous initialisez LWJGL de manière statique avant de créer un shell SWT, puis créez le shell et créez une fenêtre LWJGL?

Soit dit en passant, pour fermer une fenêtre SWT, tout ce que vous devez faire est de disposer de la Shell:

shell.dispose(); 
+0

Vous avez raison sur le conflit d'intérêts.Cependant, je suis incapable d'initialiser statiquement LWJGL avant d'essayer d'ouvrir une fenêtre d'affichage LWJGL. Il y a un constructeur statique dans Sys mais cela ne fait rien de substantiel. –

+0

Que se passe-t-il lorsque vous lancez une fenêtre LWJGL, puis une fenêtre SWT? –

+0

Je suis curieux de savoir comment cela a fonctionné pour vous! –

Questions connexes