2011-04-20 8 views
8

Tengo una aplicación en la que puede hacer clic con el botón derecho del mouse presionar y arrastrar (así como también presionar y arrastrar hacia la izquierda para diferentes operaciones). Sin embargo, al ejecutar esto en Linux, parece que los menús emergentes se desencadenan con un mousePressed y no un mouseReleased. Esto se traduce en que cada vez que presiono el botón derecho del mouse para realizar un arrastre, los menús emergentes se desencadenan (a diferencia de las ventanas, donde se libera el mouse).Activador emergente de Java en Linux

¿Alguna idea sobre cómo solucionar esto?

gracias.

EDIT: código de contabilización

Código de menú emergente

// this is called from mousePressed and mouseReleased 
if (e.isPopupTrigger() && !e.isConsumed()) { 
    // show the popup menu 
} 

Este código es lo que se llama en el botón derecho del ratón pulse/arrastre (esto es tercero código de fiesta, pero que es de código abierto, así que puede cambiar según sea necesario)

// this is called on all mouse events 
if (buttonAction.mouseButton != 0) 
{ 
    // handle the event 
} 

Respuesta

11

Sí, utilizar isPopupTrigger(), como se muestra here.

Adición:

parece isPopupTrigger se dispara en mousePressed en Linux.

Sí, es el mismo en Mac OS X. Hay que llamar isPopupTrigger() tanto mousePressed() y mouseReleased(). Hay un ejemplo relacionado en GraphPanel.

+1

Yo soy, parece que se activa PopupTrigger en mousePressed in linux. –

+0

Correcto, entonces si estoy usando una biblioteca de terceros que realiza alguna acción no emergente cuando se presiona y se arrastra el mouse derecho, ¿significa esto que el menú emergente siempre se mostrará cuando intente hacer esa otra acción? –

+0

Acabo de probar 'GraphPanel' en Windows, y veo lo que quieres decir. ¿La API de terceros expone su modelo de selección? – trashgod

1

MouseEvent.isPopupTrigger(). Devuelve si este evento de mouse es o no el evento desencadenante del menú emergente para la plataforma.

editar -: Debe hacer el control en ambos mousePresado para Linux y mouseReleased para Windows.

+0

Correcto, estoy haciendo eso. Mi problema es que cada vez que presiono el botón derecho del mouse para hacer la acción de presionar/arrastrar a la derecha, aparece el menú emergente (que no quiero). –

+0

¿Te importaría publicar el código de ambos métodos? Es difícil decir lo que estás haciendo después/antes de hacer el control sin eso. – user512802

+0

He editado la publicación para incluir el código –

0

Creo que el procedimiento correcto en su caso debe ser unificar dónde y cuándo mostrar la ventana emergente. Como evento de arrastre, si existe, después de un evento de prensa, debe evitar escribir lógica para mostrar la ventana emergente en el evento de prensa (y luego también escribir lógica en el evento de prensa para mostrar la ventana emergente). Algunos usuarios se sienten bien navegando por la ventana emergente mientras mantienen presionado el botón emergente, y algunos otros usuarios simplemente no les importa o no lo saben. Pero en su caso, no podrá navegar por el menú emergente mientras arrastra sin agregar código adicional.

De esta forma podríamos gestionar la lógica para mostrar siempre la ventana emergente en el evento de lanzamiento. Ingresar un evento de lanzamiento después de un arrastre debería ser suficiente información para saber que la ventana emergente no debería estar visible. Y por supuesto, siempre si puedes cambiar y modificar la fuente.