Mostrar JFrame en una pantalla específica en configuración de monitor dual

Tengo una configuración de monitor doble y quiero ejecutar mi GUI en un monitor específico si se encuentra. Traté de crear mi ventana JFrame pasando un objeto GraphicConfiguration de mi dispositivo de pantalla, pero no funciona, el cuadro todavía se muestra en la pantalla principal.

¿Cómo puedo configurar la pantalla donde se debe mostrar mi marco?

 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" ); } } 

He modificado la respuesta de @ Joseph-gordon para permitir una forma de lograr esto sin forzar la pantalla completa:

 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" ); } } 

En este código, getDefaultConfiguration() nunca devolverá null. Si ese no es el caso, entonces alguien por favor corrígeme. Pero, este código funciona para mover su JFrame a la pantalla deseada.

Consulte la API GraphicsDevice , aquí tiene un buen ejemplo.

Una solución mucho más limpia después de leer los documentos para JFrame.setLocationRelativeTo Display en la pantalla 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); } 

Esta función se puede usar para cambiar la ventana de la aplicación entre pantallas

Mi experiencia es con la extensión de escritorios a través de múltiples monitores, en comparación con la configuración de los monitores como pantallas separadas (X11). Si eso no es lo que quieres hacer, esto no se aplicará.

Y mi solución fue un poco hack: llamé a Toolkit.getScreenSize() , determiné si estaba en una situación de monitores múltiples (comparando la altura con el ancho y asumiendo que el ancho> dos veces la altura indicaba un multi-monitor), luego estableciendo la posición inicial X e Y del marco.

Para mí también funcionó bien (suponiendo que el monitor izquierdo tiene un tamaño de 1920×1200):

A) establecer en el monitor izquierdo en una posición exacta:

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

B) establecer en el monitor derecho en una posición exacta:

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

C) configurado en el monitor izquierdo maximizado:

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

D) configurado en el monitor derecho maximizado

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

Muchas de las soluciones aquí funcionan para pantallas extendidas. Si está utilizando pantallas separadas, simplemente pase el objeto de configuración de gráficos del dispositivo de gráficos deseado al constructor de jframe o jdialog.

La respuesta de Vickys contiene el puntero correcto. Es el nuevo JFrame (GraphicsConfiguration gc) que lo hace.

Puedes hacerlo así:

 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 desea establecerlo en el centro de la pantalla izquierda:

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

Si desea configurarlo en el centro de la pantalla derecha:

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

He modificado la respuesta @ Joseph-gordon y @ryvantage para permitir una forma de lograr esto sin forzar la posición de configuración de pantalla fija de pantalla completa y centrarla en la pantalla de selección:

 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" ); } } 

Con todos agregando sus propios sabores , basado en otros sabores, agrego el mío porque los otros lo encerraron con respecto a la posición de la ventana en la pantalla seleccionada.

Es simplemente el mejor. Le permite establecer la ubicación en la otra pantalla también.

 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); } 

Ejemplo:

 setLocation(2, 200, 200); 

¡Incluso le permite pasar un porcentaje para la posición de la pantalla!

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

la pantalla debe ser mayor que 0, ¡lo cual estoy seguro es un requisito difícil!

Para colocar el último, simplemente llame con Integer.MAX_VALUE. **