2009-12-20 14 views
11

un fragmento de mi aplicación Java:java y pantalla completa a través de múltiples monitores

JFrame f = new JFrame(); 
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); 
GraphicsDevice gd = ge.getDefaultScreenDevice(); 
gd.setFullScreenWindow(f); 

Así que lo que hace es que sea auto pantalla completa. ¡Ahora lo curioso es que el programa es a pantalla completa, pero solo en un monitor! P. ej. Tengo un sistema de Windows Vista con dos pantallas que se combinan en un escritorio. ¿Qué hacer automáticamente para que aparezca en pantalla completa en todos los monitores?


Ok he intentado:

import java.awt.image.ColorModel; 
import java.awt.GraphicsConfiguration; 
import java.awt.GraphicsDevice; 
import java.awt.GraphicsEnvironment; 
import java.awt.Rectangle; 

class grdevs 
{ 
    public static void main(String [] args) 
    { 
     GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); 
     GraphicsDevice[] gs = ge.getScreenDevices(); 
     for(GraphicsDevice curGs : gs) 
     { 
      GraphicsConfiguration[] gc = curGs.getConfigurations(); 
      for(GraphicsConfiguration curGc : gc) 
      { 
       Rectangle bounds = curGc.getBounds(); 
       ColorModel cm = curGc.getColorModel(); 

       System.out.println("" + bounds.getX() + "," + bounds.getY() + " " + bounds.getWidth() + "x" + bounds.getHeight() + " " + cm); 
      } 
     } 
    } 
} 

pero da:

0.0,0.0 1024.0x768.0 DirectColorModel: rmask=ff0000 gmask=ff00 bmask=ff amask=0 
0.0,0.0 1024.0x768.0 DirectColorModel: rmask=ff0000 gmask=ff00 bmask=ff amask=0 
0.0,0.0 1024.0x768.0 DirectColorModel: rmask=ff0000 gmask=ff00 bmask=ff amask=0 
0.0,0.0 1024.0x768.0 DirectColorModel: rmask=ff0000 gmask=ff00 bmask=ff amask=0 
0.0,0.0 1024.0x768.0 DirectColorModel: rmask=ff0000 gmask=ff00 bmask=ff amask=0 
0.0,0.0 1024.0x768.0 DirectColorModel: rmask=ff0000 gmask=ff00 bmask=ff amask=0 
1024.0,0.0 1024.0x768.0 DirectColorModel: rmask=ff0000 gmask=ff00 bmask=ff amask=0 
1024.0,0.0 1024.0x768.0 DirectColorModel: rmask=ff0000 gmask=ff00 bmask=ff amask=0 
1024.0,0.0 1024.0x768.0 DirectColorModel: rmask=ff0000 gmask=ff00 bmask=ff amask=0 
1024.0,0.0 1024.0x768.0 DirectColorModel: rmask=ff0000 gmask=ff00 bmask=ff amask=0 
1024.0,0.0 1024.0x768.0 DirectColorModel: rmask=ff0000 gmask=ff00 bmask=ff amask=0 
1024.0,0.0 1024.0x768.0 DirectColorModel: rmask=ff0000 gmask=ff00 bmask=ff amask=0 

Por ejemplo, yo esperaría un dispositivo capaz de 2048x768, ya que se combinan en un (He hecho clic en " extender el escritorio ").

Respuesta

6

Usted podría intentar:

int width = 0; 
int height = 0; 
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); 
GraphicsDevice[] gs = ge.getScreenDevices(); 
for (GraphicsDevice curGs : gs) 
{ 
    DisplayMode mode = curGs.getDisplayMode(); 
    width += mode.getWidth(); 
    height = mode.getHeight(); 
} 

Esto debe calcular el ancho total de múltiples pantallas. Obviamente, solo admite pantallas alineadas horizontalmente en el formulario anterior; deberá analizar los límites de las configuraciones de gráficos para manejar otras alineaciones de monitores (depende de cuán a prueba de balas lo desee).

Editar: Y a continuación, establecer el tamaño de su cuadro: f.setSize(width, height);

+0

Estoy de acuerdo. El comportamiento normal es maximizar/pantalla completa en un monitor. Si tiene un monitor de escritorio extendido, puede cubrir solo rectángulos "parciales" dentro del rectángulo de escritorio grande. Incluso no podían cubrir toda el área del escritorio (dos monitores en diagonal, por ejemplo), por lo que debe encontrar el gran rectángulo de escritorio y establecer el tamaño manualmente. – helios

1

Ese es el comportamiento normal cuando maximiza una ventana en Windows cuando tiene dos monitores. Para que dos obtengan el tamaño de resolución completo, deberá consultar el GraphicsConfiguration para verificar cada dispositivo de gráficos.

3

Esto no es lo que "setFullScreenWindow" es para. Es realmente para aplicaciones que desean un acceso más directo al framebuffer (mejor rendimiento), como un juego 3D en DirectX, por ejemplo. Este tipo de implica UN monitor.

Ver esta otra respuesta que hice: JDialog Not Displaying When in Fullscreen Mode

0

usando java.awt.Toolkit se puede obtener el tamaño de pantalla completa (todos los monitores):

Toolkit tk = Toolkit.getDefaultToolkit(); 
    Dimension dim = tk.getScreenSize(); 
+2

Desde mi experiencia, eso no es todo verdad. Si por todos los monitores te refieres a la dimensión de escritorio completa, es decir. Obtuve las dimensiones en uno de los monitores con esto, más específicamente en mi pantalla principal. – andersoyvind

17

Una solución más general al código de Ash es la unión de los límites de todas las configuraciones gráficas

Rectangle2D result = new Rectangle2D.Double(); 
GraphicsEnvironment localGE = GraphicsEnvironment.getLocalGraphicsEnvironment(); 
for (GraphicsDevice gd : localGE.getScreenDevices()) { 
    for (GraphicsConfiguration graphicsConfiguration : gd.getConfigurations()) { 
    result.union(result, graphicsConfiguration.getBounds(), result); 
    } 
} 
f.setSize(result.getWidth(), result.getHeight()); 

Esto funcionará para monitores alineados verticalmente, así como horizontal.

Cuestiones relacionadas