2010-06-08 16 views
6

mentre la mia app per lo swing è in esecuzione, cambio le dimensioni dello schermo (ad esempio da 1024x768 a 800x600).Come rendere consapevole un'oscillazione della modifica della dimensione dello schermo?

C'è qualche evento che posso ascoltare per essere informato su questo?

In alternativa, potevo controllare le dimensioni dello schermo in ogni paio di secondi, ma Toolkit.getScreenSize() continua a dirmi il vecchio valore.
Come è possibile ottenere la dimensione dello schermo reale dopo la modifica?

Ambiente: Linux (testato su SuSE ES 11 e Ubuntu 9.04)

Apprezzo il vostro aiuto.
Marton

risposta

2

Il seguente funzionato per me, ma io sono su un Mac, quindi non posso dire per certo che funzionerà su 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()); 

L'uscita (bla è in realtà in ingresso) era come segue:

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

Ovviamente se si dispone di dispositivi di schermo multiple, si dovrà esercitare una maggiore cautela.

1

Per calcolare la dimensione del display, è possibile utilizzare (tratto da 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()); 
     } 
    } 

È quindi possibile interrogare il width e height di virtualBounds.

Ciò funzionerà anche in configurazioni multi-monitor.

Per quanto ne so, non esiste un metodo supportato da JDK per rilevare le modifiche, quindi il polling è l'unica scommessa, oppure utilizzare JNA e il codice nativo. Se la finestra di primo livello è ingrandita, ridimensionando il display ridimensionerai anche tutte le finestre ingrandite, così puoi anche ascoltare le modifiche. Vedi questo sun tutorial per esempi di scrittura di listener di componenti.

Se non si dispone di una finestra ingrandita di livello superiore, è possibile che si possa ottenere lo stesso effetto creando una finestra ingrandita nascosta. Non posso dire con certezza se funzionerà, ma vale la pena provarci.

+0

Grazie per la risposta rapida. Sfortunatamente il frammento di cui sopra continua a mostrare le vecchie dimensioni (1024x768) su Ubuntu 9.04. Cordiali saluti, Marton –

+0

Questo è strano, poiché in sostanza utilizza le stesse API della risposta accettata. – mdma

+0

Sì, è strano, che GraphicsConfiguration.getBounds() restituisca un valore errato, mentre GraphicsDevice.getDisplayMode() restituisce quello buono. D'altra parte il GraphicsDevice.getDisplayMode() sembra essere pesante, quindi eseguirlo in ogni paio di secondi potrebbe non essere l'idea migliore. Potrei dover scegliere invece una chiamata nativa. –

-1

Dimension screenSize = Toolkit.getDefaultToolkit(). GetScreenSize();

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

+0

Questo non risponde alla domanda. – vektor

Problemi correlati