Как определить, на каком мониторе происходит событие мыши Swing?

У меня есть Java MouseListener на компоненте для обнаружения нажатий мыши. Как узнать, на каком мониторе произошло нажатие мыши?

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

Эффект, которого я пытаюсь добиться, таков: когда пользователь нажимает кнопку мыши в моем приложении, всплывающее окно показывает некоторую информацию, пока мышь не будет отпущена. Я хочу, чтобы это окно располагалось там, где пользователь щелкает, но мне нужно настроить положение окна на текущем экране, чтобы было видно все окно.


person Steve McLeod    schedule 08.08.2009    source источник
comment
Я не уверен, что это так просто. Я думаю, что вам нужно захватить мышь, чтобы увидеть какие-либо щелчки за пределами вашего окна, и я понятия не имею, как это сделать в java (отсюда комментарий - у меня нет ответа).   -  person Bill K    schedule 08.08.2009
comment
Билл, ты прав, это нелегко. Вот почему я спрашиваю коллективный мозг о переполнении стека!   -  person Steve McLeod    schedule 08.08.2009


Ответы (4)


Вы можете получить отображаемую информацию из java.awt. Графическая среда. Вы можете использовать это, чтобы получить информацию о вашей локальной системе. Включая границы каждого монитора.

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
...
person Rich Seller    schedule 08.08.2009
comment
Это половина решения, и оно помогло мне выработать все решение. Спасибо! - person Steve McLeod; 08.08.2009

Ответ Рича помог мне найти целостное решение:

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();
}
person Steve McLeod    schedule 08.08.2009
comment
Если вы хотите получить монитор по умолчанию, см. мой обновленный ответ, в многоэкранных системах, где Windows должна располагаться по центру всех дисплеев, getMaximumWindowBounds() возвращает границы всей области отображения. - person Rich Seller; 08.08.2009

Начиная с Java 1.6 вы можете использовать getLocationOnScreen, в предыдущих версиях вы должны получить местоположение компонента, сгенерировавшего событие:

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

Вам нужно будет использовать класс GraphicsEnvironment, чтобы получить границу экрана.

person oscargm    schedule 08.08.2009

Возможно, e.getLocationOnScreen(); буду работать? Это только для java 1.6.

person Denis Tulskiy    schedule 08.08.2009