Frage

Ich habe eine Java Mouselistener auf einer Komponente Maus drückt zu erkennen. Wie kann ich feststellen, welche die Maus drücken überwachen aufgetreten in?

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

Der Effekt, den ich zu erreichen bin versucht: wenn der Benutzer die Maustaste in meiner app drückt, wird ein Popup-Fenster ein paar Informationen zeigen, bis die Maustaste losgelassen wird. Ich möchte dieses Fenster, um sicherzustellen, ist so positioniert, wo der Benutzer klickt, aber ich brauche die Fensterposition auf dem aktuellen Bildschirm anzupassen, so dass das gesamte Fenster sichtbar ist.

War es hilfreich?

Lösung

Sie können die Displayinformationen von java bekommen .awt.GraphicsEnvironment . Sie können diese verwenden, um eine Information über Ihr lokales System zu erhalten. Einschließlich der Grenzen jedes Monitors.

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
...

Andere Tipps

Richs Antwort hat mir geholfen, eine ganze Lösung zu finden:

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

Seit Java 1.6 Sie getLocationOnScreen, die in früheren Versionen verwenden, können Sie die Position der Komponente erhalten müssen, die das Ereignis generiert:

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

Sie müssen die GraphicsEnvironment-Klasse verwenden, den gebundenen Rand des Bildschirms zu erhalten.

Vielleicht e.getLocationOnScreen (); wird funktionieren? Es ist nur für Java 1.6.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top