2009-09-10 8 views
5

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

Любые идеи относительно того, почему?

EDIT: Или, по крайней мере, у вас есть альтернатива? Я хочу «облачный» способ поймать события мыши на JFrame. Может быть, мышцы не ответ.

ответ

2

Потому что содержимое (возможно, JPanel) является «затенением» и потреблением событий, и они не доходят до JFrame.

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

5

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

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

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

public void mouseMoved(MouseEvent e) { 
    redispatchMouseEvent(e, false); 
} 
+0

Я бы включил его. это может помешать компонентам ниже получать события –

+0

Вы можете выполнить повторную передачу. См. Мой пересмотренный ответ. – SingleShot

+0

Существует целая проблема при включении стекла. Это лучше всего описано в Filthy Rich Clients. Вам нужно предвидеть все проблемы и исправить их. Например, вам также необходимо учитывать ключевые события, изменения курсора мыши между прочим. Я ищу готовое решение. что было предназначено для уведомления о событиях мыши на уровне кадра. –

2

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

 Смежные вопросы

  • Нет связанных вопросов^_^