120 votes

Comment centrer une fenêtre en Java ?

Quel est le moyen le plus simple de centrer un java.awt.Window comme un JFrame ou un JDialog ?

4 votes

Le titre devrait être "en Swing" et non "en Java", ce serait plus clair ainsi.

7 votes

@Joe setLocation() , setLocationRelativeTo() y setLocationByPlatform() ou tout AWT, pas Swing ;)

253voto

Andrew Swan Points 5118

Desde ce lien

Si vous utilisez Java 1.4 ou plus récent, vous pouvez utiliser la méthode simple setLocationRelativeTo(null) sur la boîte de dialogue, le cadre ou la fenêtre boîte de dialogue, le cadre ou la fenêtre pour la fenêtre.

12 votes

Comme @kleopatra l'a dit dans une autre réponse, setLocationRelativeTo(null) doit être appelé après pack() pour que cela fonctionne.

7 votes

Comme expliqué ci-dessous, setLocationRelativeTo(null) doit être appelé après tout appel de pack() ou setSize().

2 votes

@Eusebius Bizarre, j'ai suivi un tutoriel qui me l'a fait régler avant pack() et cela a placé le coin supérieur gauche du cadre au centre de mon écran. Après avoir déplacé la ligne vers le bas pack() il a été correctement centré.

68voto

Dónal Points 61837

Cela devrait fonctionner dans toutes les versions de Java

public static void centreWindow(Window frame) {
    Dimension dimension = Toolkit.getDefaultToolkit().getScreenSize();
    int x = (int) ((dimension.getWidth() - frame.getWidth()) / 2);
    int y = (int) ((dimension.getHeight() - frame.getHeight()) / 2);
    frame.setLocation(x, y);
}

0 votes

Je sais que c'est assez ancien mais cela fonctionne bien, à condition que la taille du cadre soit définie avant d'appeler cette fonction.

1 votes

Oui, assurez-vous que la taille est appliquée avant (en utilisant pack() par exemple).

33voto

setLocationRelativeTo(null) doit être appelé après avoir utilisé setSize(x,y) ou utiliser pack() .

0 votes

Vous avez raison. Il faut qu'il y ait un appel à setSize() avant.

26voto

Kevin Day Points 9446

Notez que les techniques setLocationRelativeTo(null) et Tookit.getDefaultToolkit().getScreenSize() ne fonctionnent que pour le moniteur principal. Si vous êtes dans un environnement multi-moniteur, vous devrez peut-être obtenir des informations sur le moniteur spécifique sur lequel se trouve la fenêtre avant d'effectuer ce type de calcul.

Parfois important, parfois non...

Ver javadocs de GraphicsEnvironment pour plus d'informations sur la façon de l'obtenir.

18voto

estol Points 100

Sous Linux, le code

setLocationRelativeTo(null)

Placer ma fenêtre à un endroit aléatoire à chaque fois que je la lance, dans un environnement à écrans multiples. Et le code

setLocation((Toolkit.getDefaultToolkit().getScreenSize().width  - getSize().width) / 2, (Toolkit.getDefaultToolkit().getScreenSize().height - getSize().height) / 2);

"couper" la fenêtre en deux en la plaçant au centre exact, qui se trouve entre mes deux écrans. J'ai utilisé la méthode suivante pour la centrer :

private void setWindowPosition(JFrame window, int screen)
{        
    GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment();
    GraphicsDevice[] allDevices = env.getScreenDevices();
    int topLeftX, topLeftY, screenX, screenY, windowPosX, windowPosY;

    if (screen < allDevices.length && screen > -1)
    {
        topLeftX = allDevices[screen].getDefaultConfiguration().getBounds().x;
        topLeftY = allDevices[screen].getDefaultConfiguration().getBounds().y;

        screenX  = allDevices[screen].getDefaultConfiguration().getBounds().width;
        screenY  = allDevices[screen].getDefaultConfiguration().getBounds().height;
    }
    else
    {
        topLeftX = allDevices[0].getDefaultConfiguration().getBounds().x;
        topLeftY = allDevices[0].getDefaultConfiguration().getBounds().y;

        screenX  = allDevices[0].getDefaultConfiguration().getBounds().width;
        screenY  = allDevices[0].getDefaultConfiguration().getBounds().height;
    }

    windowPosX = ((screenX - window.getWidth())  / 2) + topLeftX;
    windowPosY = ((screenY - window.getHeight()) / 2) + topLeftY;

    window.setLocation(windowPosX, windowPosY);
}

Fait apparaître la fenêtre au centre du premier écran. Ce n'est probablement pas la solution la plus simple.

Fonctionne correctement sur Linux, Windows et Mac.

0 votes

Prendre en compte les environnements multi-écrans est la seule réponse correcte, sinon l'écran où la fenêtre apparaît pourrait être aléatoire ou la fenêtre est centrée entre les deux écrans.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X