Вопрос по java, swing, mouseevent, multiple-monitors – Как определить, на каком мониторе происходит событие мыши Swing?

10

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

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

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

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

Ваш Ответ

4   ответа
13

Вы можете получить информацию о дисплее от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
...
Это половина решения, и оно помогло мне разработать решение полностью. Спасибо! Steve McLeod
Это было, и я проголосовал за тебя! Steve McLeod
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();
}
Если вы хотите получить монитор по умолчанию, см. Мой обновленный ответ, в многоэкранных системах, где Windows должна быть центрирована по всем дисплеям, getMaximumWindowBounds () возвращает границыentire Область отображения.
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, чтобы получить границы экрана.

0

буду работать? Это только для Java 1.6.

Похожие вопросы