2010-06-08 3 views
6

während meine Swing-App läuft, ändere ich die Größe des Bildschirms (z. B. von 1024x768 zu 800x600).Wie macht man eine Swing-App auf die Änderung der Bildschirmgröße aufmerksam?

Gibt es ein Ereignis, das ich hören kann, um darüber benachrichtigt zu werden?

Alternativ könnte ich die Bildschirmgröße alle paar Sekunden überprüfen, aber die Toolkit.getScreenSize() sagt mir immer den alten Wert.
Wie konnte ich die reale Bildschirmgröße nach der Änderung erhalten?

Umwelt: Linux (getestet auf SuSE ES 11 und Ubuntu 9.04)

Ich schätze Ihre Hilfe.
Marton

Antwort

2

Die folgenden für mich gearbeitet, aber ich bin auf einem Mac, so dass ich nicht sicher sagen kann, dass es unter Linux funktionieren:

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()); 

Der Ausgang (bla tatsächlich eingegeben wird) wurde als folgt:

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

Offensichtlich, wenn Sie mehrere Bildschirmgeräte haben, müssen Sie größere Vorsicht walten lassen.

1

die Anzeigegröße zu berechnen, Sie (aus 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()); 
     } 
    } 

Sie können dann die width und height der Abfrage virtualBounds verwenden können.

Dies funktioniert auch in Multi-Monitor-Setups.

Soweit ich weiß, gibt es keine von JDK unterstützte Methode, um Änderungen zu erkennen, also ist das Polling Ihre einzige Wette oder verwenden Sie JNA und nativen Code. Wenn das Fenster der obersten Ebene maximiert ist, ändert die Größenänderung der Anzeige auch die Größe aller maximierten Fenster, so dass Sie auch dort auf Änderungen achten können. Beispiele für das Schreiben von Komponenten-Listenern finden Sie unter sun tutorial.

Wenn Sie kein Maximierungsfenster auf oberster Ebene haben, können Sie möglicherweise auch denselben Effekt erzielen, indem Sie ein verborgenes maximiertes Fenster erstellen. Ich kann nicht sicher sagen, ob das funktioniert, aber es ist einen Versuch wert.

+0

Vielen Dank für die schnelle Antwort. Leider zeigt das obige Snippet die alte Größe (1024x768) auf Ubuntu 9.04 an. Mit freundlichen Grüßen, Marton –

+0

Das ist seltsam, da es im Wesentlichen die gleichen APIs wie die angenommene Antwort verwendet. – mdma

+0

Ja, es ist seltsam, dass die GraphicsConfiguration.getBounds() einen falschen Wert zurückgibt, während GraphicsDevice.getDisplayMode() den guten zurückgibt. Auf der anderen Seite scheint der GraphicsDevice.getDisplayMode() zu Schwergewicht zu sein, so dass es in einigen paar Sekunden nicht die beste Idee ist. Möglicherweise muss ich stattdessen einen nativen Anruf wählen. –

-1

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

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

+0

Dies beantwortet die Frage nicht. – vektor