2009-08-08 8 views
10

Mam element Java MouseListener na komponencie wykrywającym naciśnięcia myszy. Jak mogę sprawdzić, na którym monitorze nastąpiło naciśnięcie przycisku myszy?Jak określić, na którym monitorze występuje zdarzenie myszy Swing?

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

Efekt staram się osiągnąć to: gdy użytkownik naciśnie przycisk myszy w moim app, okienko pokazuje pewne informacje, aż zwolnieniu przycisku myszy. Chcę upewnić się, że to okno jest ustawione w miejscu, w którym użytkownik kliknie, ale muszę dostosować położenie okna na bieżącym ekranie, aby całe okno było widoczne.

+0

nie jestem pewien, że to takie proste. Myślę, że musisz przechwycić mysz, aby zobaczyć kliknięcia poza twoim oknem, i nie mam pojęcia, jak to zrobić w Javie (Stąd komentarz - nie mam "odpowiedzi"). –

+1

Bill, masz rację, to nie jest łatwe. Właśnie dlatego pytam mózg zbiorowy, którym jest Stack Overflow! –

Odpowiedz

13

Możesz uzyskać informacje na wyświetlaczu od java.awt.GraphicsEnvironment. Możesz użyć tego do uzyskania informacji o systemie lokalnym. W tym granice każdego monitora.

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

To połowa rozwiązania i pomogło mi opracować całe rozwiązanie. Dzięki! –

+0

To było, i głosowałem na ciebie! –

0

Może e.getLocationOnScreen(); będzie działać? To tylko dla java 1.6.

1

Ponieważ Java 1.6 można użyć getLocationOnScreen, w poprzednich wersjach trzeba dostać lokalizację elementu, który wygenerował zdarzenie:

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

trzeba będzie użyć klasy GraphicsEnvironment aby uzyskać związany z ekranu .

2

Richa odpowiedź pomogła mi znaleźć całe rozwiązanie:

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

Jeśli chcesz uzyskać domyślny monitor, zobacz moją zaktualizowaną odpowiedź, w systemach wieloekranowych, gdzie Windows powinien być wyśrodkowany na wszystkich wyświetlaczach, getMaximumWindowBounds() zwraca granice * całego * obszaru wyświetlania. –