2010-02-10 53 views
10

Tengo 2 pantallas conectadas, por lo que puedo iniciar mi aplicación Java en la pantalla principal o secundaria.¿Cómo detectar la pantalla actual con Java?

La pregunta es: ¿Cómo puedo saber qué pantalla contiene la ventana de mi aplicación, es decir, hay una forma de detectar la pantalla actual con Java?

Respuesta

21

java.awt.Window es la clase base de todas las ventanas de nivel superior (Marco, JFrame, diálogo, etc.) y contiene el método getGraphicsConfiguration() que devuelve el GraphicsConfiguration que está usando la ventana. GraphicsConfiguration tiene el método getGraphicsDevice() que devuelve el GraphicsDevice al que pertenece la GraphicsConfiguration. A continuación, puede usar la clase GraphicsEnvironment para probar esto en todos los dispositivos de gráficos del sistema y ver a cuál pertenece la ventana.

Window myWindow = .... 
// ... 
GraphicsConfiguration config = myWindow.getGraphicsConfiguration(); 
GraphicsDevice myScreen = config.getDevice(); 
GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment(); 
// AFAIK - there are no guarantees that screen devices are in order... 
// but they have been on every system I've used. 
GraphicsDevice[] allScreens = env.getScreenDevices(); 
int myScreenIndex = -1; 
for (int i = 0; i < allScreens.length; i++) { 
    if (allScreens[i].equals(myScreen)) 
    { 
     myScreenIndex = i; 
     break; 
    } 
} 
System.out.println("window is on screen" + myScreenIndex); 
4

El método propuesto por Nate no funciona cuando otro monitor acaba de ser añadido al sistema y el usuario vuelve a colocar la ventana de Java en ese monitor. Esta es una situación que mis usuarios enfrentan con frecuencia, y la única forma de evitarlo ha sido reiniciar java.exe para obligarlo a volver a incluir los monitores.

El problema principal es myWindow.getGraphicsConfiguration(). GetDevice() siempre devuelve el dispositivo original donde se inició el applet de Java o la aplicación. Esperaría que mostrara el monitor actual, pero mi propia experiencia (una muy lenta y frustrante) es que simplemente confiar en myWindow.getGraphicsConfiguration(). GetDevice() no es infalible. Si alguien tiene un enfoque diferente que sea más confiable, házmelo saber.

Al realizar la coincidencia de pantallas (utilizando la llamada allScreen [i] .equals (myScreen)), a continuación, se devuelve el monitor original donde se invocó el Applet, y no el nuevo monitor donde podría haberse reposicionado.

+0

favor compruebe mi respuesta ... que puede o no puede ayudar tú – Wolf

3

solución de Nate parecen funcionar en la mayoría , pero no todos los casos, ya que tenía que experimentar. perplejo menciona que tuvo problemas cuando los monitores se conectaron, tuve problemas con los comandos clave "Win + Left" y "Win + Right". Mi solución al problema se parece a esto (tal vez la solución tiene problemas en su propio, pero al menos esto funciona mejor para mí que la solución de Nate):

GraphicsDevice myDevice = myFrame.getGraphicsConfiguration().getDevice(); 
for(GraphicsDevice gd:GraphicsEnvironment.getLocalGraphicsEnvironment().getScreenDevices()){ 
    if(frame.getLocation().getX() >= gd.getDefaultConfiguration().getBounds().getMinX() && 
     frame.getLocation().getX() < gd.getDefaultConfiguration().getBounds().getMaxX() && 
     frame.getLocation().getY() >= gd.getDefaultConfiguration().getBounds().getMinY() && 
     frame.getLocation().getY() < gd.getDefaultConfiguration().getBounds().getMaxY()) 
     myDevice=gd; 
} 
Cuestiones relacionadas