2009-08-08 12 views
10

Ho un MouseListener Java su un componente per rilevare le presse del mouse. Come posso sapere su quale monitor è stata utilizzata la rotativa del mouse?Come determinare su quale monitor si verifica un evento del mouse Swing?

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

L'effetto che sto cercando di realizzare è: quando l'utente preme il pulsante del mouse nella mia app, una finestra pop-up mostra alcune informazioni, fino a quando il mouse viene rilasciato. Voglio assicurarmi che questa finestra sia posizionata dove l'utente fa clic, ma ho bisogno di regolare la posizione della finestra sulla schermata corrente in modo che l'intera finestra sia visibile.

+0

io non sono sicuro che sia così facile. Penso che devi catturare il mouse per vedere tutti i clic fuori dalla tua finestra, e non ho idea di come farlo in java (Quindi il commento - Non ho "Risposta"). –

+1

Bill, hai ragione, non è facile. Ecco perché chiedo al cervello collettivo che sia Stack Overflow! –

risposta

13

È possibile ottenere informazioni sul display da java.awt.GraphicsEnvironment. Puoi usarlo per ottenere informazioni sul tuo sistema locale. Compresi i limiti di ciascun 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

Questa è metà della soluzione e mi ha aiutato a capire l'intera soluzione. Grazie! –

+0

Era, e ti ho votato! –

0

Forse e.getLocationOnScreen(); funzionerà? È solo per java 1.6.

1

Dal momento che Java 1.6 è possibile utilizzare getLocationOnScreen, nelle versioni precedenti è necessario ottenere la posizione del componente che ha generato l'evento:

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

si dovrà utilizzare la classe GraphicsEnvironment per ottenere il limite dello schermo .

2

risposta di Rich mi ha aiutato a trovare una intera soluzione:

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

Se si desidera ottenere il monitor predefinito, consultare la risposta aggiornata, su sistemi multischermo in cui Windows deve essere centrato su tutti i display, getMaximumWindowBounds() restituisce i limiti dell'area di visualizzazione * intera *. –

Problemi correlati