Afficher JFrame dans un écran spécifique en configuration double moniteur

J’ai une configuration à deux moniteurs et je veux lancer mon interface graphique sur un moniteur spécifique si celui-ci est trouvé. J’ai essayé de créer ma fenêtre JFrame passant un object GraphicConfiguration de mon écran, mais cela ne fonctionne pas, le cadre s’affiche toujours sur l’écran principal.

Comment puis-je définir l’écran où mon cadre doit être affiché?

 public static void showOnScreen( int screen, JFrame frame ) { GraphicsEnvironment ge = GraphicsEnvironment .getLocalGraphicsEnvironment(); GraphicsDevice[] gs = ge.getScreenDevices(); if( screen > -1 && screen < gs.length ) { gs[screen].setFullScreenWindow( frame ); } else if( gs.length > 0 ) { gs[0].setFullScreenWindow( frame ); } else { throw new RuntimeException( "No Screens Found" ); } } 

J’ai modifié la réponse de @ Joseph-gordon pour permettre d’y parvenir sans forcer le plein écran:

 public static void showOnScreen( int screen, JFrame frame ) { GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); GraphicsDevice[] gd = ge.getScreenDevices(); if( screen > -1 && screen < gd.length ) { frame.setLocation(gd[screen].getDefaultConfiguration().getBounds().x, frame.getY()); } else if( gd.length > 0 ) { frame.setLocation(gd[0].getDefaultConfiguration().getBounds().x, frame.getY()); } else { throw new RuntimeException( "No Screens Found" ); } } 

Dans ce code, je suppose que getDefaultConfiguration() ne retournera jamais null. Si ce n’est pas le cas, alors s’il vous plaît, corrigez-moi. Mais, ce code fonctionne pour déplacer votre JFrame sur l’écran souhaité.

S’il vous plaît se référer à GraphicsDevice API, vous avez un bon exemple là-bas.

Une solution beaucoup plus propre après avoir lu les documents de JFrame.setLocationRelativeTo Display à l’écran 2

 public void moveToScreen() { setVisible(false); GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); GraphicsDevice[] screens = ge.getScreenDevices(); int n = screens.length; for (int i = 0; i < n; i++) { if (screens[i].getIDstring().contentEquals(settings.getScreen())) { JFrame dummy = new JFrame(screens[i].getDefaultConfiguration()); setLocationRelativeTo(dummy); dummy.dispose(); } } setVisible(true); } 

Cette fonction peut être utilisée pour changer de fenêtre d'application entre les écrans

Mon expérience porte sur l’extension de postes de travail sur plusieurs moniteurs, par opposition à la configuration des moniteurs en tant qu’écrans séparés (X11). Si ce n’est pas ce que vous voulez faire, cela ne s’appliquera pas.

Et ma solution était un peu un hack: j’ai appelé Toolkit.getScreenSize() , déterminé si j’étais dans une situation multi-moniteur (en comparant la hauteur à la largeur et en supposant que la largeur> deux fois la hauteur indiquée multi-moniteur), alors régler la position initiale X et Y de la trame.

Pour moi a bien fonctionné aussi (en supposant que le moniteur gauche a la taille 1920×1200):

A) mis sur moniteur gauche sur une position exacte:

newFrame.setBounds(200,100,400,200)

B) mis sur moniteur droit sur une position exacte:

newFrame.setBounds(2000,100,200,100)

C) réglé sur le moniteur de gauche maximisé:

newFrame.setBounds(200,100,400,200) newFrame.setExtendedState(JFrame.MAXIMIZED_BOTH)

D) mis sur le moniteur droit maximisé

newFrame.setBounds(2000,100,200,100) newFrame.setExtendedState(JFrame.MAXIMIZED_BOTH)

La plupart des solutions proposées ici fonctionnent pour des affichages étendus. Si vous utilisez des affichages séparés, transmettez simplement l’object de configuration graphique du périphérique graphique souhaité au constructeur de jframe ou jdialog.

La réponse de Vickys contient le bon pointeur. C’est le nouveau JFrame (GraphicsConfiguration gc) qui le fait.

Vous pouvez le faire comme ça:

 GraphicsDevice otherScreen = getOtherScreen(this); JFrame frameOnOtherScreen = new JFrame(otherScreen.getDefaultConfiguration()); private GraphicsDevice getOtherScreen(Component component) { GraphicsEnvironment graphicsEnvironment = GraphicsEnvironment.getLocalGraphicsEnvironment(); if (graphicsEnvironment.getScreenDevices().length == 1) { // if there is only one screen, return that one return graphicsEnvironment.getScreenDevices()[0]; } GraphicsDevice theWrongOne = component.getGraphicsConfiguration().getDevice(); for (GraphicsDevice dev : graphicsEnvironment.getScreenDevices()) { if (dev != theWrongOne) { return dev; } } return null; } 

Si vous voulez le placer au centre de l’écran de gauche:

 int halfScreen = (int)(screenSize.width/2); frame.setLocation((halfScreen - frame.getSize().width)/2, (screenSize.height - frame.getSize().height)/2); 

Si vous voulez le placer au centre de l’écran droit:

 int halfScreen = (int)(screenSize.width/2); frame.setLocation((halfScreen - frame.getSize().width)/2 + halfScreen, (screenSize.height - frame.getSize().height)/2); 

J’ai modifié @ Joseph-gordon et @ryvantage answer pour permettre d’y parvenir sans forcer une position de configuration d’écran plein écran fixe et la centrer sur l’écran sélectionné:

 public void showOnScreen(int screen, JFrame frame ) { GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); GraphicsDevice[] gd = ge.getScreenDevices(); int width = 0, height = 0; if( screen > -1 && screen < gd.length ) { width = gd[screen].getDefaultConfiguration().getBounds().width; height = gd[screen].getDefaultConfiguration().getBounds().height; frame.setLocation( ((width / 2) - (frame.getSize().width / 2)) + gd[screen].getDefaultConfiguration().getBounds().x, ((height / 2) - (frame.getSize().height / 2)) + gd[screen].getDefaultConfiguration().getBounds().y ); frame.setVisible(true); } else { throw new RuntimeException( "No Screens Found" ); } } 

Avec chacun de ses goûts , basés sur d’autres saveurs, j’ajoute le mien parce que les autres vous ont bloqué en ce qui concerne le positionnement de la fenêtre sur l’écran sélectionné.

C’est tout simplement le meilleur. Il vous permet également de définir l’emplacement sur l’autre écran.

 public void setLocation( int screen, double x, double y ) { GraphicsEnvironment g = GraphicsEnvironment.getLocalGraphicsEnvironment(); GraphicsDevice[] d = g.getScreenDevices(); if ( screen >= d.length ) { screen = d.length - 1; } Rectangle bounds = d[screen].getDefaultConfiguration().getBounds(); // Is double? if ( x == Math.floor(x) && !Double.isInfinite(x) ) { x *= bounds.x; // Decimal -> percentage } if ( y == Math.floor(y) && !Double.isInfinite(y) ) { y *= bounds.y; // Decimal -> percentage } x = bounds.x + x; y = jframe.getY() + y; if ( x > bounds.x) x = bounds.x; if ( y > bounds.y) y = bounds.y; // If double we do want to floor the value either way jframe.setLocation((int)x, (int)y); } 

Exemple:

 setLocation(2, 200, 200); 

Même vous permet de passer un pourcentage pour la position de l’écran!

 setLocation(2, 0.5, 0); // Place on right edge from the top down if combined with setSize(50%, 100%); 

l’écran doit être plus grand que 0, ce qui, j’en suis sûr, est une exigence difficile!

Pour terminer, appelez simplement avec Integer.MAX_VALUE. **