10

我在一个组件上有一个 Java MouseListener 来检测鼠标按下。如何判断鼠标按下发生在哪个显示器上?

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

我想要达到的效果是:当用户在我的应用程序中按下鼠标按钮时,弹出窗口会显示一些信息,直到释放鼠标。我想确保此窗口位于用户单击的位置,但我需要调整当前屏幕上的窗口位置,以便整个窗口可见。

4

4 回答 4

14

您可以从java.awt.GraphicsEnvironment获取显示信息。您可以使用它来获取有关本地系统的信息。包括每个监视器的边界。

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
...
于 2009-08-08T09:57:44.360 回答
2

丰富的回答帮助我找到了一个完整的解决方案:

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();
}
于 2009-08-08T13:21:36.337 回答
1

从 Java 1.6 开始,您可以使用 getLocationOnScreen,在以前的版本中,您必须获取生成事件的组件的位置:

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

您将不得不使用 GraphicsEnvironment 类来获取屏幕的边界。

于 2009-08-08T10:16:20.267 回答
0

也许 e.getLocationOnScreen(); 将工作?它仅适用于 java 1.6。

于 2009-08-08T10:03:39.840 回答