MouseListener на JFrame - PullRequest
       48

MouseListener на JFrame

5 голосов
/ 11 сентября 2009

Я хочу получать уведомления о событиях мыши (в частности, события входа и выхода мыши) на моем JFrame. Но когда я добавляю к нему курсор мыши, я получаю события на границах кадра, а не весь кадр с его содержимым.

Есть идеи, почему?

РЕДАКТИРОВАТЬ: Или, по крайней мере, у вас есть альтернатива? Я хочу "глобальный" способ отлавливать события мыши на JFrame. Может быть, мышиный слух не является ответом.

Ответы [ 4 ]

6 голосов
/ 11 сентября 2009

Вы можете получить все события и проверить, является ли их источник компонентом в JFrame.

См. Toolkit.addAWTEventListener

5 голосов
/ 11 сентября 2009

Существует невидимый компонент, который перекрывает весь графический интерфейс, «стеклянную панель». Вы можете присоединить своих слушателей к этому. Пример:

JFrame frame = new JFrame();
Component glassPane = frame.getGlassPane();
glassPane.addMouseListener(myListener);

Если вы хотите, чтобы ваши перехваченные события проходили через нижележащие компоненты, вы можете повторно их отправить. Например:

public void mouseMoved(MouseEvent e) {
    redispatchMouseEvent(e, false);
}
2 голосов
/ 11 сентября 2009

Альтернативой AWTEventListener является нажатие EventQueue. Это дает преимущество в том, что апплеты и приложение WebStart могут это делать.

2 голосов
/ 11 сентября 2009

Потому что содержимое (вероятно, JPanel) "затеняет" и потребляет события, и они не достигают JFrame.

Что вы можете сделать, это добавить одного и того же слушателя ко всем детям. Там должен быть лучший способ, хотя.

...