2009-08-08 6 views
10

J'ai un Java MouseListener sur un composant pour détecter les presses de la souris. Comment puis-je savoir sur quel moniteur la souris est-elle apparue?Comment déterminer le moniteur dans lequel se produit un événement de souris Swing?

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

l'effet que je suis en train de réaliser est la suivante: lorsque l'utilisateur appuie sur le bouton de la souris dans mon application, une fenêtre pop-up affiche quelques informations, jusqu'à ce que la souris est relâché. Je veux m'assurer que cette fenêtre est positionnée là où l'utilisateur clique, mais j'ai besoin d'ajuster la position de la fenêtre sur l'écran actuel pour que toute la fenêtre soit visible.

+0

Je ne suis pas sûr que c'est facile. Je pense que vous devez capturer la souris pour voir tous les clics en dehors de votre fenêtre, et je n'ai aucune idée de comment faire cela en Java (D'où le commentaire - Je n'ai pas de "Réponse"). –

+1

Bill, tu as raison, ce n'est pas facile. C'est pourquoi je demande au cerveau collectif qu'est Stack Overflow! –

Répondre

13

Vous pouvez obtenir des informations d'affichage à partir de java.awt.GraphicsEnvironment. Vous pouvez l'utiliser pour obtenir des informations sur votre système local. Y compris les limites de chaque moniteur.

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

C'est la moitié de la solution, et cela m'a aidé à mettre au point toute la solution. Merci! –

+0

C'était, et je vous ai voté! –

0

Peut-être e.getLocationOnScreen(); marchera? C'est seulement pour Java 1.6.

1

Depuis Java 1.6, vous pouvez utiliser getLocationOnScreen, dans les versions précédentes, vous devez obtenir l'emplacement du composant qui a généré l'événement:

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

Vous devrez utiliser la classe GraphicsEnvironment pour obtenir la limite de l'écran .

2

réponse Rich m'a aidé à trouver une solution complète:

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 vous souhaitez obtenir le moniteur par défaut, voir ma mise à jour, sur les systèmes multi-écrans où Windows doit être centré sur tous les affichages, getMaximumWindowBounds() renvoie les limites de la zone d'affichage * entier *. –

Questions connexes