2010-06-08 10 views
6

mientras mi aplicación de columpios se está ejecutando, modifico el tamaño de la pantalla (por ejemplo, de 1024x768 a 800x600).¿Cómo hacer que una aplicación swing sea consciente del cambio en el tamaño de la pantalla?

¿Hay algún evento que pueda escuchar para recibir notificaciones sobre esto?

Ocasionalmente pude comprobar el tamaño de la pantalla en cada dos segundos, pero el Toolkit.getScreenSize() me sigue diciendo el valor anterior.
¿Cómo puedo obtener el tamaño real de pantalla después del cambio?

Medio Ambiente: Linux (probado en SuSE ES 11 y Ubuntu 9.04)

aprecio su ayuda.
Marton

Respuesta

2

La siguiente trabajó para mí, pero estoy en un Mac, así que no puedo decir con seguridad que va a trabajar en Linux:

System.out.println(GraphicsEnvironment.getLocalGraphicsEnvironment().getScreenDevices()[0].getDisplayMode().getWidth() + "x" + GraphicsEnvironment.getLocalGraphicsEnvironment().getScreenDevices()[0].getDisplayMode().getHeight()); 

//Ignore this block, it was simply to give me a chance to change my resolution 
Scanner readUserInput=new Scanner(System.in); 
System.out.println("Waiting on input, go change your resolution"); 
String myName=readUserInput.nextLine(); 

System.out.println(GraphicsEnvironment.getLocalGraphicsEnvironment().getScreenDevices()[0].getDisplayMode().getWidth() + "x" + GraphicsEnvironment.getLocalGraphicsEnvironment().getScreenDevices()[0].getDisplayMode().getHeight()); 

La salida (bla es en realidad de entrada) era tan sigue:

1440x900 
Waiting on input, go change your resolution 
blah 
1280x960 

Obviamente, si tiene múltiples dispositivos de pantalla, tendrá que tener mayor precaución.

1

Para calcular el tamaño de la pantalla, puede utilizar (tomado de GraphicsConfiguration javadoc)

Rectangle virtualBounds = new Rectangle(); 
    GraphicsEnvironment ge = GraphicsEnvironment. 
      getLocalGraphicsEnvironment(); 
    GraphicsDevice[] gs = 
      ge.getScreenDevices(); 
    for (int j = 0; j < gs.length; j++) { 
     GraphicsDevice gd = gs[j]; 
     GraphicsConfiguration[] gc = 
      gd.getConfigurations(); 
     for (int i=0; i < gc.length; i++) { 
      virtualBounds = 
       virtualBounds.union(gc[i].getBounds()); 
     } 
    } 

Luego, puede consultar el width y height de virtualBounds.

Esto también funcionará en configuraciones de monitores múltiples.

Por lo que yo sé, no existe un método compatible con JDK para detectar cambios, por lo que la votación es su única apuesta, o use JNA y el código nativo. Si su ventana de nivel superior está maximizada, entonces cambiar el tamaño de la pantalla también cambiará el tamaño de las ventanas maximizadas, para que pueda escuchar los cambios allí también. Consulte esto sun tutorial para ver ejemplos de oyentes de componentes de escritura.

Si no tiene una ventana maximizada de nivel superior, entonces también puede lograr el mismo efecto creando una ventana oculta maximizada. No puedo decir con certeza si esto funcionará, pero vale la pena intentarlo.

+0

Gracias por la respuesta rápida. Desafortunadamente, el fragmento de arriba sigue mostrando el tamaño anterior (1024x768) en Ubuntu 9.04. Saludos cordiales, Marton –

+0

Eso es extraño, ya que, en esencia, usa las mismas API que la respuesta aceptada. – mdma

+0

Sí, es extraño que GraphicsConfiguration.getBounds() devuelva un valor incorrecto, mientras que GraphicsDevice.getDisplayMode() devuelve el bueno. Por otro lado, el GraphicsDevice.getDisplayMode() parece tener un peso pesado, por lo que realizarlo en cada par de segundos podría no ser la mejor idea. Puede que tenga que elegir una llamada nativa en su lugar. –

-1

Dimensión screenSize = Toolkit.getDefaultToolkit(). GetScreenSize();

f.setSize (screenSize.width, screenSize.height);

+0

Esto no responde la pregunta. – vektor

Cuestiones relacionadas