2009-07-20 9 views
8

He estado intentando y no puedo usar el modo de pantalla completa de Java en la pantalla principal de un sistema OSX. Todo lo que he intentado parece que no puedo deshacerme de la barra de menú 'manzana' de la parte superior de la pantalla. Realmente necesito pintar sobre toda la pantalla. ¿Alguien puede decirme cómo deshacerse del menú?¿Cómo puedo hacer pantalla completa en Java en OSX

He adjuntado una clase de ejemplo que muestra el problema: en mi sistema, el menú aún está visible donde podría esperar ver una pantalla completamente en blanco.

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.JFrame; 

public class FullScreenFrame extends JFrame implements KeyListener { 

    public FullScreenFrame() { 
     addKeyListener(this); 
     setUndecorated(true); 
     GraphicsDevice gd = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice(); 

     if (gd.isFullScreenSupported()) { 
      try { 
       gd.setFullScreenWindow(this); 
      } 
      finally { 
       gd.setFullScreenWindow(null); 
      } 
     } 
     else { 
      System.err.println("Full screen not supported"); 
     } 

     setVisible(true); 
    } 

    public void keyTyped(KeyEvent e) {} 
    public void keyPressed(KeyEvent e) {} 
    public void keyReleased(KeyEvent e) { 
     setVisible(false); 
     dispose(); 
    } 

    public static void main (String [] args) { 
     new FullScreenFrame(); 
    } 
} 
+1

Por qué estás haciendo pantalla completa de la ventana y luego inmediatamente llamando setFullScreenWindow (null)? –

+1

@mmyers: Esa es la respuesta. Por favor agregue es como tal, no puedo resistir la tentación – OscarRyz

Respuesta

12

Creo que su problema está aquí:

try { 
     gd.setFullScreenWindow(this); 
} 
finally { 
     gd.setFullScreenWindow(null); 
} 

finally bloques se ejecutan siempre, así que lo que sucede aquí es que la ventana se convierte en pantalla completa por un breve instante (si eso) y luego deja de usar la pantalla de inmediato.

Además, setVisible(true) no es necesario cuando ha llamado previamente a setFullScreenWindow(this), de acuerdo con Javadocs.

Así que me gustaría cambiar el constructor para esto:

public FullScreenFrame() { 
    addKeyListener(this); 

    GraphicsDevice gd = 
      GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice(); 

    if (gd.isFullScreenSupported()) { 
     setUndecorated(true); 
     gd.setFullScreenWindow(this); 
    } else { 
     System.err.println("Full screen not supported"); 
     setSize(100, 100); // just something to let you see the window 
     setVisible(true); 
    } 
} 
+0

Gracias - ¡eso funciona! La construcción try - finally se tomó de http://java.sun.com/docs/books/tutorial/extra/fullscreen/exclusivemode.html donde sugiere este formulario para evitar que la aplicación mantenga la pantalla después de salir - pero parece Tendré que mantener activa la cerradura en la pantalla para evitar que se lance demasiado pronto. Gracias! –

+2

Observe el "..." allí? Ahí es donde algo que bloquea hasta que la ventana está cerrada debería desaparecer. El intento ... finalmente se acerca, simplemente protege contra las excepciones que podrían evitar que tu aplicación libere la pantalla cuando esté lista. (Curiosamente, aunque 'setFullScreenWindow' hace que la ventana sea visible, no se bloquea como' setVisible'. Me pregunto si eso es por diseño.) –

+0

Ahora el dispositivo gráfico actúa como un jframe, es decir, puede agregar jpannels a él ? – fftk4323

6

en OS X (10.7 y superior), es mejor utilizar el modo de pantalla completa nativo disponible. Debe utilizar:

com.apple.eawt.FullScreenUtilities.setWindowCanFullScreen(window,true); 
com.apple.eawt.Application.getApplication().requestToggleFullScreen(window); 

donde window es la ventana (JFrame, etc) que desea tener pantalla completa

+0

¡Maravilloso! Lo necesitaba porque, al menos en OS X, los aceleradores de menú no funcionan en el modo de pantalla completa de gráficos típicos. Esta es la verdadera solución OS X +1 –

+0

. Necesitará una reflexión para probar esas clases y ejecutar el código ¿verdad? –

+0

@UnitedStatesOfAmerica La reflexión es de una sola manera. Alternativamente, puede usar un stub jar en plataformas que no sean de Apple, como se proporciona aquí: http://stackoverflow.com/a/2639395 –

Cuestiones relacionadas