IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AWT/Swing Java Discussion :

[DUAL SCREEN] - Centrer JFrame sur "écran actif"


Sujet :

AWT/Swing Java

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 151
    Points : 144
    Points
    144
    Par défaut [DUAL SCREEN] - Centrer JFrame sur "écran actif"
    Bonjour,

    J'ai une appli qui est une bête JFrame (qui ne contient qu'un label et une progressbar). L'appli est lancée par double clic sur le Jar depuis l'explorateur Windows.
    Le client (et moi) avons des dual screen.

    Je souhaite que si :
    - l'appli est lancée depuis un explorateur Windows depuis l'écran 1, alors l'appli s'affiche et se centre sur l'écran 1
    - l'appli est lancée depuis un explorateur Windows depuis l'écran 2, alors l'appli s'affiche et se centre sur l'écran 2
    - l'appli est lancée par un "java -jar" l'appli se centre sur n'importe quel écran.

    Dans les faits, avec un setLocationRelativeTo(null), l'appli se centre à chaque fois sur l'écran 1 (principal), même si j'ai démarré l'appli depuis un explorateur affiché dans l'écran 2.
    Pour reproduire mon problème, j'ai résumé l'appli à ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
            JFrame frame = new JFrame();
            frame.setSize(500, 100);
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
     
    // sleep pour simuler un traitement dans cette appli minimaliste
            try {
                Thread.sleep(10000);
            } catch (InterruptedException e1) {
                System.out.println(e1);
            }
    Si à la place du frame.setLocationRelativeTo(null); je fais un frame.setLocationByPlatform(true); alors, l'appli s'affiche sur le bon écran (mais pas centré; ce dernier point ne me choque pas)
    Information complémentaire (à tout hasard) : je suis openJDK 1.8.0_181 ... (et je n'ai pas la possibilité de faire bouger la version de la jre)

    Avez-vous une solution pour que mon appli s'affiche sur le bon écran ?

    Cordialement,

  2. #2
    Membre averti
    Homme Profil pro
    Architecte technique
    Inscrit en
    Mai 2020
    Messages
    326
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mai 2020
    Messages : 326
    Points : 439
    Points
    439
    Par défaut
    Bonjour,

    Il me semble qu'il est possible de savoir sur quel écran se trouve une Window mais pas de connaître l'écran "actif".

    En fait, l'écran "actif" est celui sur lequel se trouve votre curseur. Avec la position du curseur et les détails des écrans vous devrez être capable de détecter l'écran "actif" et d'y centrer votre fenêtre.

    La position absolue du curseur est lisible via MouseInfo.getPointerInfo().getLocation(); (https://alvinalexander.com/java/java...n-coordinates/). La liste des écrans s'obtient via GraphicsEnvironment il me semble (https://docs.oracle.com/javase/8/doc...creenDevices--)

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 151
    Points : 144
    Points
    144
    Par défaut
    Merci pour votre réponse

    Alors, j'avais pensé à une solution comme ça mais j'espérais ne pas avoir à le gérer "à la main" (c'est mon côté feignant qui parle).
    En lisant votre réponse, je m'y suis résigné :p

    La conclusion, c'est que ça fonctionne super bien; du coup si ça peut aider les copaings :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
        /**
         * Si l'appli est lancée par double clic depuis un explorateur Windows alors dans le cas d'un dual screen, le
         * setLocationRelativeTo(null) centre sur l'écran 1, même si l'explorateur windows est affiché sur l'écran 2.
         * 
         * Cette fonction est une rustine permettant de centrer l'affichage de la Frame sur le bon écran.
         */
        private void centrerSurEcranActif() {
            final Point p = MouseInfo.getPointerInfo().getLocation();
     
            // dans le cas hypothétique où il n'y aurait pas de souris, on centre sur n'importe quel écran.
            if (null == p) {
                setLocationRelativeTo(null);
                return;
            }
     
            // Sinon, on recherche l'écran dans lequel est la souris, et on centre par rapport à ce dernier.
            GraphicsDevice ecranActif = null;
            for (final GraphicsDevice gc : GraphicsEnvironment.getLocalGraphicsEnvironment().getScreenDevices()) {
                final Rectangle dimensionEcran = gc.getDefaultConfiguration().getBounds();
                if (dimensionEcran.contains(p)) {
                    ecranActif = gc;
                    break;
                }
            }
     
            // on centre également dans n'importe quel écran, si on n'arrive pas à trouver l'écran actif ...
            if (null == ecranActif) {
                LOG.debug("Impossible de trouver l'écran actif.");
                setLocationRelativeTo(null);
            } else {
                // on centre sur l'écran actif.
                final Rectangle dimensionEcran = ecranActif.getDefaultConfiguration().getBounds();
                setLocation(dimensionEcran.x + (dimensionEcran.width - getWidth()) / 2, dimensionEcran.y + (dimensionEcran.height - getHeight()) / 2);
            }
        }
    Merci gervais.b pour le coup de main

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Position des JFrames sur l'écran
    Par alex2746 dans le forum Agents de placement/Fenêtres
    Réponses: 12
    Dernier message: 10/04/2014, 11h56
  2. Centrer Application sur l'écran
    Par donnadieujulien dans le forum Débuter
    Réponses: 8
    Dernier message: 13/04/2011, 17h51
  3. [WIN32] Dual screen : bloquer la souris sur un écran
    Par tazer dans le forum Bibliothèques
    Réponses: 1
    Dernier message: 06/08/2009, 14h19
  4. Problème sur 2 écrans (dual-screen)
    Par afrodje dans le forum Périphériques
    Réponses: 8
    Dernier message: 30/03/2009, 11h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo