2009-02-08 5 views
2

Lorsque mon programme démarre, la fenêtre principale se place là où elle était lors de sa dernière fermeture. Je veux modifier ce comportement de sorte que si la fenêtre est hors-écran (ou partiellement hors-écran), elle se déplace complètement sur l'écran.Java: Comptabilisation des barres de tâches/menubars/etc en plaçant une fenêtre sur le bureau?

J'ai ce fonctionnement parfaitement. Voici le code:

int x = gameConfig.windowX; 
    int y = gameConfig.windowY; 
    int width = gameConfig.windowWidth; 
    int height = gameConfig.windowHeight; 

    if(x < 0) x = 0; 
    if(y < 0) y = 0; 

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

    if(x + width > screenSize.width) x = screenSize.width - width; 
    if(y + height > screenSize.height) y = screenSize.height - height; 

    if(width > screenSize.width) width = screenSize.width; 
    if(height > screenSize.height) height = screenSize.height; 

    this.setLocation(x, y); 
    this.setSize(width, height); 

    if(gameConfig.screenMaximized) { 
     this.setExtendedState(getExtendedState() | MAXIMIZED_BOTH); 
    } 



Cela fonctionne comme prévu, mais avec une grande exception; il ne tient pas compte des barres de tâches. Sur les fenêtres, si la fenêtre est au-delà du bas de l'écran, ce code le corrigera, mais il laisse toujours un morceau de la fenêtre bloqué par la barre des tâches.

Je ne suis pas sûr comment faire cela. Y a-t-il un moyen de demander à java des barres de tâches dans le système, et quelle est leur largeur/hauteur?


Merci qui a parfaitement fonctionné. Savez-vous comment l'obtenir afin que Java reflète la taille d'écran totale de mes deux moniteurs quand j'appelle getScreenSize()? En ce moment, il revient 1600x1200, quand il est vraiment 3200x1200, réparti sur deux moniteurs.

L'API Java suggère que GraphicsConfiguration.getBounds() ferait l'affaire, mais cela renvoie toujours le rectangle {0, 0, 1600, 1200}.

Répondre

4

Utilisez getScreenInsets (Java 4+):

static public Insets getScreenInsets(Window wnd) { 
    Insets        si; 

    try { 
     if(wnd==null) { si=Toolkit.getDefaultToolkit().getScreenInsets(new Frame().getGraphicsConfiguration()); } 
     else   { si=wnd.getToolkit()   .getScreenInsets(wnd.getGraphicsConfiguration());   } 
     } catch(NoSuchMethodError thr) { si=new Insets(0,0,0,0); } 
    return si; 
    } 

(Cette méthode permet de multiples écrans et JVM plus anciens qui ne prennent pas en charge l'API). Et, rappelez-vous toujours que la barre des tâches peut être sur n'importe quel bord de l'écran, pas seulement le bas.

+0

"La barre des tâches peut être sur n'importe quel bord de l'écran" - c'est ma barre des tâches dont vous parlez (à droite de l'écran). Trop d'applications * m'ont forcé à le déplacer vers la gauche (arghh!), Et certaines ne fonctionnent pas correctement. –

+0

Ouais - Sun ne nous a pas aidé, attendant Java 4 pour inclure la possibilité de déterminer où était la chose. –

0

Sur la question des écrans multiples, je n'ai pas fait cela, mais je crois que chaque écran a sa propre configuration graphique. Si je comprends bien, vous pouvez énumérer les configurations pour trouver celui que vous voulez - alors vous utilisez les mêmes API que nous avons déjà discuté.

On dirait que le Doco pour GraphicConfiguration a les détails dont vous avez besoin:

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++) { 
     ... 
     } 
    } 
2

Le code ci-dessous a fonctionné pour moi, même testé en déplaçant la barre d'outils à droite. Mais n'a pas essayé avec plusieurs écrans.

public class Scene extends JFrame { 
private static final long serialVersionUID = 42L; 

public Scene() { 
    Canvas canvas = new Canvas(); 
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    this.setContentPane(canvas); 
    this.pack(); 
    this.putFrameInRightCorner(); 
    this.setVisible(true); 
} 

protected void putFrameInRightCorner(){ 
    Rectangle winSize = GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds(); 
    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); 
    Dimension frameSize = this.getSize(); 
    int taskBarWidth = screenSize.width - winSize.width; 
    int taskBarHeight = screenSize.height - winSize.height; 
    this.setLocation((screenSize.width - frameSize.width - taskBarWidth), 
         (screenSize.height - frameSize.height - taskBarHeight)); 
} 

public static void main(String[] args) { 
    SwingUtilities.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
      new Scene(); 
     } 
    }); 
} 
} 
+0

Avoir à remplacer le (JPanel) getPreferredSize du canevas pour retourner la taille désirée. Public Dimension Dimension getPreferredSize() { \t \t dimension de retour; \t} –

1

En suivant après Pavan Kumar Kundagol Sundara's, a répondu le 9 janvier à 14h03, je suis arrivé ce beau et fonctionne parfaitement code:

import java.awt.GraphicsEnvironment; 
import java.awt.Rectangle; 

Rectangle janelSOdisponivel = GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds(); 
int janelaSOaltura = janelSOdisponivel.height; 
int janelaSOlargura = janelSOdisponivel.width; 

Et puis en utilisant les deux variables (janelaSOaltura , janelaSOlargura) mais j'avais besoin.

Questions connexes