Pregunta

Tengo un MouseListener Java en un componente para detectar pulsaciones de ratón. ¿Cómo puedo saber que controlan la prensa ratón se produjo en?

@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 esta ventana se posiciona en el que el usuario hace clic, pero necesito para ajustar la posición de la ventana en la pantalla actual, de modo que toda la ventana es visible.

¿Fue útil?

Solución

Usted puede obtener información de la pantalla de .awt.GraphicsEnvironment. Usted puede usar esto para obtener una información acerca de 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
...

Otros consejos

respuesta

Rich me ayudó a encontrar una solución completa:

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

Desde Java 1.6 se puede utilizar getLocationOnScreen, en las versiones anteriores 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.

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top