2009-09-10 12 views
5

Deseo recibir notificaciones de eventos de mouse (específicamente el mouse ingresado y salido de eventos) en mi JFrame. Pero cuando le agrego un mouselistener obtengo los eventos en los bordes del marco no todo el marco con sus contenidos.MouseListener en JFrame

¿Alguna idea de por qué?

EDITAR: ¿O al menos tienes una alternativa? Quiero una forma "global" de atrapar eventos de mouse en el JFrame. Tal vez un mouselistener no es la respuesta.

Respuesta

2

Porque los contenidos (probablemente un JPanel) están "ocultando" y consumiendo los eventos y no llegan al JFrame.

Lo que puede hacer es agregar el mismo oyente a todos los niños. Sin embargo, debería haber una mejor manera.

5

Hay un componente invisible que se superpone a toda la GUI, el "panel de cristal". Puedes unir a tus oyentes a eso. Ejemplo:

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

Si desea que sus eventos interceptados pasen a los componentes subyacentes, puede volver a enviarlos. Por ejemplo:

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

tendré que habilitarlo. esto evitaría que los componentes que se encuentran debajo reciban eventos –

+0

Puede volver a enviarlos. Ver mi respuesta revisada. – SingleShot

+0

Existe un problema completo al habilitar el panel de vidrio. Se describe mejor en Filthy Rich Clients. Debes prever todos los problemas y rectificarlos. Por ejemplo, también necesita contabilizar eventos clave, cambios de cursor del mouse entre otras cosas. Estoy buscando una solución preparada. algo que fue diseñado para notificar eventos de mouse en un nivel de marco. –

2

Una alternativa a AWTEventListener es empujar un EventQueue. Esto tiene la ventaja de que los applets y la aplicación WebStart pueden hacer esto.