2010-06-08 23 views
6

Pendant que mon application swing est en cours d'exécution, je change la taille de l'écran (par exemple de 1024x768 à 800x600).Comment faire pour qu'une application de swing prenne conscience de la modification de la taille de l'écran?

Y at-il un événement que je peux écouter pour être averti à ce sujet?

Sinon, je pourrais vérifier la taille de l'écran toutes les deux secondes, mais le Toolkit.getScreenSize() ne cesse de me dire l'ancienne valeur. Comment puis-je obtenir la taille d'écran réel après la modification?

Environnement: Linux (testé sur SuSE ES 11 et Ubuntu 9.04)

Je vous remercie de votre aide.
Marton

Répondre

2

Ce qui suit a fonctionné pour moi, mais je suis sur un Mac, donc je ne peux pas dire pour sûr que cela fonctionnera sous 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 sortie (bla est en fait entrée) était comme suit:

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

De toute évidence, si vous avez plusieurs appareils à écran, vous devrez faire preuve de plus de prudence.

1

Pour calculer la taille d'affichage, vous pouvez utiliser (extrait 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()); 
     } 
    } 

Vous pouvez ensuite interroger le width et height de virtualBounds.

Cela fonctionnera également dans les configurations multi-moniteurs. Pour autant que je sache, il n'y a pas de méthode prise en charge par JDK pour détecter les changements, donc l'interrogation est votre seul pari, ou utilisez le code JNA et le code natif. Si votre fenêtre de niveau supérieur est agrandie, le redimensionnement de l'affichage redimensionnera également toutes les fenêtres agrandies, afin que vous puissiez également y écouter les modifications. Voir ce sun tutorial pour des exemples d'écriture des composants d'écoute.

Si vous ne disposez pas d'une fenêtre agrandie de niveau supérieur, vous pouvez également obtenir le même résultat en créant une fenêtre agrandie masquée. Je ne peux pas dire avec certitude si cela fonctionnera, mais cela vaut la peine d'essayer.

+0

Merci pour votre réponse rapide. Malheureusement, l'extrait ci-dessus continue d'afficher l'ancienne taille (1024x768) sur Ubuntu 9.04. Cordialement, Marton –

+0

C'est étrange, car il utilise essentiellement les mêmes API que la réponse acceptée. – mdma

+0

Oui, il est étrange que GraphicsConfiguration.getBounds() renvoie une valeur incorrecte alors que GraphicsDevice.getDisplayMode() renvoie la valeur correcte. D'autre part, le GraphicsDevice.getDisplayMode() semble être un poids lourd, donc l'exécuter toutes les deux secondes peut-être pas la meilleure idée. Je pourrais avoir à choisir un appel natif à la place. –

-1

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

f.setSize (tailleDécoupe, tailled'écran.hauteur);

+0

Cela ne répond pas à la question. – vektor