How do I determine which monitor a Swing mouse event occurs in?

前端 未结 4 916
攒了一身酷
攒了一身酷 2020-12-06 02:30

I have a Java MouseListener on a component to detect mouse presses. How can I tell which monitor the mouse press occurred in?

@Override
public void mousePres         


        
相关标签:
4条回答
  • 2020-12-06 02:50

    Rich's answer helped me find a whole solution:

    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 讨论(0)
  • 2020-12-06 03:03

    Since Java 1.6 you can use getLocationOnScreen, in previous versions you must get the location of the component that generated the event:

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

    You will have to use the GraphicsEnvironment class to get the bound of the screen.

    0 讨论(0)
  • 2020-12-06 03:09

    You can get display information from java.awt.GraphicsEnvironment. You can use this to get a information about your local system. Including the bounds of each 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 讨论(0)
  • 2020-12-06 03:10

    Maybe e.getLocationOnScreen(); will work? It's only for java 1.6.

    0 讨论(0)
提交回复
热议问题