как получить координаты щелчка мышью за моим окном в Java

Я должен реализовать класс, с помощью Swing, который может получить координаты мыши, когда пользователь нажимает где угодно на экран. если бы я хотел получить координаты мыши в своем собственном окне, то я использовал бы a MouseListener, но я хочу, чтобы это работало, даже когда пользователь нажимает вне моей программы.

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

19
задан cd1 10 March 2010 в 18:38
поделиться

6 ответов

Это возможно, хотя и ограничено:

Добавьте AWTEventListener для событий фокуса. Пока ваше приложение находится в фокусе до нажатия кнопки, вы получите событие потери фокуса. Затем запросите положение указателя.

Ограничение состоит в том, что, конечно же, ваше приложение теряет фокус. Так что в зависимости от того, чего вы в конечном итоге пытаетесь достичь, это может быть бесполезным.

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

Доказательство первого метода:

import java.awt.AWTEvent;
import java.awt.MouseInfo;
import java.awt.Toolkit;
import java.awt.event.AWTEventListener;

import javax.swing.JFrame;

public class Application1 {
    public static void main(String[] args) {
        Toolkit.getDefaultToolkit().addAWTEventListener(
          new Listener(), AWTEvent.MOUSE_EVENT_MASK | AWTEvent.FOCUS_EVENT_MASK);
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }

    private static class Listener implements AWTEventListener {
        public void eventDispatched(AWTEvent event) {
            System.out.print(MouseInfo.getPointerInfo().getLocation() + " | ");
            System.out.println(event);
        }
    }
}

Щелчок за пределами созданного приложения:

java.awt.Point[x=198,y=59] | java.awt.event.MouseEvent[MOUSE_EXITED, ...
java.awt.Point[x=976,y=503] | java.awt.FocusEvent[FOCUS_LOST, ...

Второй пункт - за пределами приложения.

24
ответ дан 30 November 2019 в 02:04
поделиться

Забудьте о GlassPane , есть еще один 100% нативный способ Java, который работает как в OS X, так и в Windows.

Java всегда поддерживала прозрачность для своих окон в OS X, а Java теперь поддерживает прозрачность и для своих окон в Windows (начиная с версии Java 1.6.0_10 или около того, необходимо проверить).

Уловка заключается в следующем: щелкнув инструмент «Выбрать цвет» , вы создадите почти прозрачное окно Java без полей, покрывающее весь экран. Вы устанавливаете его альфа на 10 (альфа изменяется от 0 до 255). Эта альфа настолько мала, что пользователь не заметит очень тонкое «почти прозрачное, но только очень-очень-полупрозрачное» окно без полей, покрывающее весь экран.

Теперь, когда пользователь щелкает по вашему «альфа-каналу с 10 полупрозрачным окном без полей», покрывающим весь экран, вы получаете (x, y).

Отменить окно Java без полей.

Используйте робота getRgb (x, y) , и все готово.

Почему установить альфа на 10, а не на 0? Потому что в противном случае щелчки не перехватываются Java, а идут непосредственно в ОС (по крайней мере, так это работает в OS X). Есть порог, и я знаю, что он не установлен ни на «1», ни на «2», это около 10 или около того.

РЕДАКТИРОВАТЬ Я только что понял, что вы знаете, что нужно выбрать несколько цветов, это сложнее, но все же можно сделать, используя 100% Java.Либо вы можете жить с «слегка размытыми» цветами (на которые влияет «почти прозрачный» «невидимый» слой) или , получив щелчок, вы должны удалить слой, получить правильный цвет пикселей и снова поставить «почти прозрачный» слой. Конечно, это чертовски крутой хакер, но это можно сделать на 100% Java.

21
ответ дан 30 November 2019 в 02:04
поделиться

У меня еще недостаточно репутации, чтобы оставлять комментарии, но вот мои комментарии по другим методам:

  • Использование собственной библиотеки: будет работать, но имеет очевидные ограничения распространения

  • Используйте GlassPane для заполнения всего экрана : GlassPanes должны содержаться в Window.

  • Создать окно с изображением рабочего стола и заполнить весь экран: будет работать, но он внезапно сделает рабочий стол статичным. Курсор больше не будет меняться, любые анимации или видео в других окнах или на рабочем столе станут жутко статичными.

Альтернативное решение: Уточнение окна заполнения экрана, если вы используете Java 6u10 или новее, заключается в том, чтобы сделать окно полностью прозрачным . Поместите это окно перед всеми остальными и слушайте щелчки мыши. У него все еще есть недостатки, такие как отсутствие смены курсора, но это зависит от того, что вы хотите сделать.

0
ответ дан 30 November 2019 в 02:04
поделиться

Я сам этого не пробовал, но, возможно, вы могли бы создать полноэкранную прозрачную панель / фрейм и т. Д. И добавить к этому MouseListener.

2
ответ дан 30 November 2019 в 02:04
поделиться

Я не знаю, возможно ли это с использованием чистой Java.

Невозможно использовать чистую Java, поскольку Java знает только о MouseEvents в Windows, принадлежащих Java.

4
ответ дан 30 November 2019 в 02:04
поделиться

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

Как уже показал Keilly, получить можно только положение мыши.

Вам нужно включить native lib

4
ответ дан 30 November 2019 в 02:04
поделиться
Другие вопросы по тегам:

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