2012-07-16 28 views
12

Estoy escribiendo una aplicación que se pretende ejecutar en una configuración de monitor dual, con un JFrame "Pantalla" en pantalla completa en un monitor y un JFrame "Control" en el otro monitor, enviando instrucciones a la pantalla. Probé dos métodos distintos para configurar la pantalla completa; el éxito de cada uno parece depender del sistema operativo.Java setFullScreenWindow() mantener en la parte superior

display.setUndecorated(true); 
display.setExtendedState(JFrame.MAXIMIZED_BOTH); 

Funciona en Windows, pero el JFrame se oculta debajo de la base/paneles en OS X y Linux.

Mi otro método, utilizando

GraphicsDevice.setFullScreenWindow(display); 

Obras en los tres sistemas operativos que he intentado, pero en Windows, centrándose la ventana de control en el otro monitor hace que la piel Ventana de visualización, y llamando

display.setAlwaysOnTop(true); 

No soluciona el problema. Soy parcial al método GraphicsDevice porque no tengo que lidiar con los problemas en OS X o Linux, y espero que el problema de Windows sea una solución simple. ¿Lo es?

Respuesta

10

Prueba esto ...

para la pantalla múltiple

GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); 
GraphicsDevice[] gs = ge.getScreenDevices(); 


// Get size of each screen 

for (int i=0; i<gs.length; i++) { 
    DisplayMode dm = gs[i].getDisplayMode(); 
    int screenWidth = dm.getWidth(); 
    int screenHeight = dm.getHeight(); 
} 

Uso public final void setAlwaysOnTop(boolean alwaysOnTop) para poner la ventana en la parte superior, si la ventana es visible, con lo que esto incluye ventana toFront, a continuación, se "pega" a la posición más alta.

+0

Gracias por responder, pero ¿qué se supone que debo hacer con los valores de ancho y alto de ese ciclo for? Intenté usar 'setAlwaysOnTop (true);', pero eso no funcionó cuando lo probé. No tengo acceso a Windows durante una hora más o menos, pero noté que dijiste "Si la ventana está visible", ¿entonces tal vez lo llamé antes de configurar la ventana? Lo intentaré pronto y acepto tu respuesta si funciona. – BitFiber

+0

Demasiado tarde para editar mi comentario ... pero 'setAlwaysOnTop (true);' todavía no funciona en Windows. Sin embargo, encontré una solución en el uso de 'System.getProperty (" os.name ");' para comprobar si el sistema operativo actual es Windows, por lo que puedo usar el método 'setExtendedState'. – BitFiber

+0

Lo siento, ya que no funcionó para usted, pero gracias por la información abt el trabajo alrededor .... –

4

Me encuentro con el mismo problema. Mi manera de resolverlo fue anular la función show() en el jframe y al usar un buffer strategy nunca volver a salir de la función de mostrar. Por lo tanto algo como esto:

@override 
public void show(){ 
     super.show(); 
     //Create a double buffering strategy 
     createBufferStrategy(2); 
     BufferStrategy bs = getBufferStrategy(); 
     while(true){ 
       //draw our frame 
       Graphics g = bs.getGraphics(); 
       paint(g); 
       //dispose of our graphics 
       g.dispose(); 
       //Show our frame 
       bs.show(); 
       try{ 
        //Don't use all our cpu-power 
        Thread.sleep(10); 
       }catch(Exception e){ 
        //Do something (this probably will never happen) 
       } 
     } 
} 

En realidad, sería mejor si uno usó setVisible(boolean) en lugar de show() (show es obsoleto). La ventana no siempre estará en la parte superior (aún puede arrastrar otra ventana encima), pero no se ocultará automáticamente cuando le dé enfoque a otra ventana. Ese es el comportamiento que quieres, supongo.

Nota: No llamar show en el EventQueue, ya que esto hará que el EventQueue inútil, y hace que el JFrame ignorar todos los eventos. La función show debe invocarse con un nuevo hilo, y luego se seguirán manejando todos los eventos.

Cuestiones relacionadas