2010-11-22 27 views
6

Je suis en train de faire une application Swing qui rend en plein écran, suivant la description ici http://download.oracle.com/javase/tutorial/extra/fullscreen/exclusivemode.html et le code source ici http://download.oracle.com/javase/tutorial/extra/fullscreen/example-1dot4/DisplayModeTest.javaSwing plein écran avec JOGL

Cela fonctionne très bien, mais dès que je laisse tomber dans un GLCanvas objet comme l'un des composants de l'image, tout ce qui apparaît est un écran noir. En quittant le plein écran, je peux voir l'image OpenGL pendant un moment en plein écran, puis elle s'affiche à nouveau dans une fenêtre. Même si rien n'est affiché, je peux interagir avec les composants swing, comme les boutons, comme s'ils l'étaient.

Il me semble presque comme un autre tampon vide est en cours de dessin au-dessus de l'application swing réel, mais je ne peux pas comprendre pourquoi ce serait. Alternativement, je me demande si ce n'est pas un problème avec le plein écran géré par la carte graphique qui gère également JOGL? Je n'ai pas besoin de le plein écran accéléré par le matériel, bien qu'il puisse être agréable - si cela est insoluble, existe-t-il une manière plus robuste d'implémenter le plein écran dans une application Java?

+0

OS? Fournisseur d'implémentation OpenGL? – genpfault

+0

Désolé, j'ai supposé (bête de moi) que ce serait indépendant de la plate-forme. Je cours Windows 7 avec un Nvidia GForce 9600M GT. – dimo414

Répondre

4

Essayez de désactiver -Dsun.java2d.noddraw=true en tant que this FAQ.

+0

Merci, cela a fonctionné parfaitement. Maintenant, je dois trouver la meilleure façon de forcer cet argument de ligne de commande à être inclus chaque fois qu'il est exécuté. – dimo414

+2

Testez en définissant 'System.setProperty (" sun.java2d.noddraw "," true ");' – dacwe

+0

Glorieux, merci./Maintenant/J'ai juste besoin de comprendre comment activer et désactiver la décoration du cadre ('setUndecorated()'?) Après l'affichage du cadre. Je vais demander/chercher moi-même, à moins que tu ne veuilles m'aider un peu plus? : P – dimo414

0

Vous ne pouvez pas appeler setUndecorated (...) sur une fenêtre affichable, vous devez l'éliminer en premier, mais vous disposerez également du canevas. Utilisez un dessin partagé pour cela et supprimez-le avant d'appeler disposer() sur le cadre.

+0

Oui, j'ai rencontré ce problème. Ce n'est heureusement qu'un inconvénient mineur pour ma demande, mais j'aimerais quand même que cela fonctionne correctement. Pourriez-vous élaborer sur ce que vous entendez par «Utiliser un dessin partageable pour le faire et l'enlever»? – dimo414

+0

J'ai fait face au même problème. Si vous utilisez uniquement un contexte partagé, lorsque vous supprimez un canevas d'une fenêtre, ce contexte sera détruit sauf si vous utilisez NEWT au lieu de AWT/Swing. Vous pouvez voir un exemple de tirages partagés ici: http://jogamp.org/git/?p=jogl.git;a=blob;f=src/junit/com/jogamp/test/junit/jogl/acore/TestSharedContextListAWT .java; h = b44158dce98537b7e12e4a354a702d0082f2b4ef; hb = de2a30104098216963132ed02b3dd66acd799d9e # l65 – gouessej

+1

J'ai découvert que la cause réelle du problème que je rencontrais était un code d'installation exécuté une fois dans init() du panneau OpenGL. Depuis qu'initial() est appelé à nouveau lors de l'affichage du panneau, il le ré-exécute. En déplaçant le code d'exécution unique vers le constructeur, j'ai résolu les problèmes que je voyais, et cela fonctionne maintenant parfaitement: D – dimo414