2009-08-08 10 views
10

Tengo un Java MouseListener en un componente para detectar las pulsaciones del mouse. ¿Cómo puedo saber en qué monitor se produjo la pulsación del mouse?¿Cómo puedo determinar en qué monitor se produce un evento de mouse Swing?

@Override 
public void mousePressed(MouseEvent e) { 
    // I want to make something happen on the monitor the user clicked in 
} 

El efecto que estoy tratando de lograr es: cuando el usuario pulsa el botón del ratón en mi aplicación, una ventana emergente mostrará algo de información, hasta que se suelte el ratón. Quiero asegurarme de que esta ventana esté ubicada donde el usuario hace clic, pero necesito ajustar la posición de la ventana en la pantalla actual para que toda la ventana esté visible.

+0

No estoy seguro de que es así de fácil. Creo que debes capturar el mouse para ver cualquier clic fuera de tu ventana, y no tengo idea de cómo hacerlo en Java (de ahí el comentario, no tengo "Answer"). –

+1

Bill, tienes razón, no es fácil. ¡Por eso le pregunto al cerebro colectivo que es Stack Overflow! –

Respuesta

13

Puede obtener información de la pantalla de java.awt.GraphicsEnvironment. Puede usar esto para obtener información sobre su sistema local. Incluyendo los límites de cada monitor.

Point point = event.getPoint(); 

GraphicsEnvironment e 
    = GraphicsEnvironment.getLocalGraphicsEnvironment(); 

GraphicsDevice[] devices = e.getScreenDevices(); 

Rectangle displayBounds = null; 

//now get the configurations for each device 
for (GraphicsDevice device: devices) { 

    GraphicsConfiguration[] configurations = 
     device.getConfigurations(); 
    for (GraphicsConfiguration config: configurations) { 
     Rectangle gcBounds = config.getBounds(); 

     if(gcBounds.contains(point)) { 
      displayBounds = gcBounds; 
     } 
    } 
} 

if(displayBounds == null) { 
    //not found, get the bounds for the default display 
    GraphicsDevice device = e.getDefaultScreenDevice(); 

    displayBounds =device.getDefaultConfiguration().getBounds(); 
} 
//do something with the bounds 
... 
+0

Esta es la mitad de la solución, y me ayudó a resolver toda la solución. ¡Gracias! –

+0

¡Fue, y te voté! –

0

Tal vez e.getLocationOnScreen(); ¿trabajará? Es solo para Java 1.6.

1

Desde Java 1.6 se puede utilizar getLocationOnScreen, en las versiones anteriores se debe obtener la ubicación del componente que generó el evento:

Point loc; 
// in Java 1.6 
loc = e.getLocationOnScreen(); 
// in Java 1.5 or previous 
loc = e.getComponent().getLocationOnScreen(); 

Usted tendrá que utilizar la clase GraphicsEnvironment para obtener el atado de la pantalla .

2

respuesta de Rich me ayudó a encontrar una solución entera:

public void mousePressed(MouseEvent e) { 
    final Point p = e.getPoint(); 
    SwingUtilities.convertPointToScreen(p, e.getComponent()); 
    Rectangle bounds = getBoundsForPoint(p); 
    // now bounds contains the bounds for the monitor in which mouse pressed occurred 
    // ... do more stuff here 
} 


private static Rectangle getBoundsForPoint(Point point) { 
    for (GraphicsDevice device : GraphicsEnvironment.getLocalGraphicsEnvironment().getScreenDevices()) { 
     for (GraphicsConfiguration config : device.getConfigurations()) { 
      final Rectangle gcBounds = config.getBounds(); 
      if (gcBounds.contains(point)) { 
       return gcBounds; 
      } 
     } 
    } 
    // if point is outside all monitors, default to default monitor 
    return GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds(); 
} 
+0

Si desea obtener el monitor predeterminado, vea mi respuesta actualizada, en sistemas de pantallas múltiples donde Windows debe centrarse en todas las pantallas, getMaximumWindowBounds() devuelve los límites del área de visualización * completa *. –

Cuestiones relacionadas