По сути, я хочу узнать, нажата ли какая-либо кнопка мыши, и если да, то какая. Проблема в том, что я не использую (постоянно сфокусированную) среду пользовательского интерфейса. Он предназначен для работы в фоновом режиме, пока ОС сосредоточена на другом окне. У меня просто настроен графический интерфейс Swing для удобного управления.
Как я мог это сделать?
(Кстати, я пытаюсь запросить его внутри цикла, поэтому настройка прослушивателя событий будет неэффективной.)
исправлено, извините, английский не мой родной язык
Он предназначен для работы в фоновом режиме, пока ОС сосредоточена на другом окне. - Качели так не работают. Swing может обрабатывать события только тогда, когда событие генерируется в сфокусированном окне Swing. Если вы хотите прослушивать события ОС, вам нужно использовать JNI или JNA (я не знаю разницы).
я знаю, я думаю, что я также заявил, что в вопросе. Swing ui не предназначен для обработки запросов или событий.
Java не является предпочтительным языком при попытке отслеживать события ОС. Java должен быть независимым от ОС.
Как упоминалось другими, вам нужно будет использовать JNA, чтобы подключиться к собственным API операционной системы. К счастью для вас, есть отличная библиотека, которая делает именно это jnativehook.
Вот некоторый демонстрационный код, который создает Global Mouse Listener:
import GlobalScreen;
import NativeHookException;
import NativeMouseEvent;
import NativeMouseInputListener;
public class GlobalMouseListenerExample implements NativeMouseInputListener {
public void nativeMouseClicked(NativeMouseEvent e) {
System.out.println("Mouse Clicked: " + e.getClickCount());
}
public void nativeMousePressed(NativeMouseEvent e) {
System.out.println("Mouse Pressed: " + e.getButton());
}
public void nativeMouseReleased(NativeMouseEvent e) {
System.out.println("Mouse Released: " + e.getButton());
}
public void nativeMouseMoved(NativeMouseEvent e) {
System.out.println("Mouse Moved: " + e.getX() + ", " + e.getY());
}
public void nativeMouseDragged(NativeMouseEvent e) {
System.out.println("Mouse Dragged: " + e.getX() + ", " + e.getY());
}
public static void main(String[] args) {
try {
GlobalScreen.registerNativeHook();
}
catch (NativeHookException ex) {
System.err.println("There was a problem registering the native hook.");
System.err.println(ex.getMessage());
System.exit(1);
}
// Construct the example object.
GlobalMouseListenerExample example = new GlobalMouseListenerExample();
// Add the appropriate listeners.
GlobalScreen.addNativeMouseListener(example);
GlobalScreen.addNativeMouseMotionListener(example);
}
}
Также не забывайте читать о безопасности потоков, когда Работаете со Swing с использованием упомянутой библиотеки.
Я хотел объяснить, что я пытаюсь определить, нажата ли кнопка мыши и какая из них нажата. починил это