Tengo un detector de mouse. Tiene algún código para responder a los eventos mouseUp y mouseDown. Esto funciona correctamenteLos eventos MouseDown no se entregan hasta MouseUp cuando hay una fuente de arrastre
Sin embargo, tan pronto como agregue un DragSource, mi evento mouseDown ya no se entrega, ¡hasta que suelte el botón del mouse!
Esto es trivial de reproducir: a continuación se muestra un programa simple que contiene un shell simple con solo un detector de mouse y un detector de arrastre. Cuando ejecuto esto (en una Mac), y mantengo presionado el botón del mouse, no pasa nada, pero tan pronto como suelto el botón del mouse, instantáneamente veo los eventos del mouse hacia abajo y el mouse hacia arriba entregados. Si hago un comentario sobre la fuente de arrastre, los eventos del mouse se entregan como deberían.
He buscado otras personas con problemas similares, y el más cercano que he encontrado para una explicación es la siguiente:
https://bugs.eclipse.org/bugs/show_bug.cgi?id=26605#c16 "Si gancho remolque detecta, el sistema operativo tiene que comer los eventos del ratón hasta que se determina que has arrastrado o no ".
Sin embargo, no entiendo por qué es cierto: ¿por qué el sistema operativo debe comer los eventos del mouse para determinar si tengo un arrastre o no? El arrastre no se inicia hasta que tengo un evento mouse -move- con el botón presionado.
Lo más importante: ¿Alguien puede sugerir una solución? (Intenté agregar y eliminar dinámicamente mi origen de arrastre cuando se presiona el mouse, pero luego no pude obtener la función de arrastrar & para que funcione correctamente, ya que nunca vi presionar la tecla inicial, y no puedo encontrar la manera de iniciar programáticamente un . arrastre)
Aquí está el programa de ejemplo:
package swttest;
import org.eclipse.swt.dnd.DND;
import org.eclipse.swt.dnd.DragSource;
import org.eclipse.swt.dnd.DragSourceEvent;
import org.eclipse.swt.dnd.DragSourceListener;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseListener;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
public class SwtTest {
public static void main(String[] args) {
final Display display = new Display();
final Shell shell = new Shell(display);
shell.addMouseListener(new MouseListener() {
public void mouseUp(MouseEvent e) {
System.out.println("mouseUp");
}
public void mouseDown(MouseEvent e) {
System.out.println("mouseDown");
}
public void mouseDoubleClick(MouseEvent e) {
System.out.println("mouseDoubleClick");
}
});
DragSourceListener dragListener = new DragSourceListener() {
public void dragFinished(DragSourceEvent event) {
System.out.println("dragFinished");
}
public void dragSetData(DragSourceEvent event) {
System.out.println("dragSetData");
}
public void dragStart(DragSourceEvent event) {
System.out.println("dragStart");
}
};
DragSource dragSource = new DragSource(shell, DND.DROP_COPY | DND.DROP_MOVE);
dragSource.addDragListener(dragListener);
shell.pack();
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
}
Lo he intentado y su código funciona en Windows. Podría ser el error – nanda
específico del sistema operativo. Acabo de probar esto en Ubuntu 10.04 y funciona bastante bien. Presiona el botón izquierdo del mouse para obtener ningún evento. Mueva el mouse para obtener 'mouseDown' y' dragStart' * al mismo tiempo *. Cuando lo dejas, obtienes el evento 'mouseUp'. Si mantienes el mouse quieto y presionas el botón izquierdo, obtienes un 'mouseDown' después de un notable retraso de 1-2 segundos. De cualquier manera, 'mouseDown' siempre se ve antes de soltar el mouse. Debe ser un problema SWT en Mac? – richq
Gracias a ambos: parece que esto es definitivamente específico de la plataforma. Sin embargo, parece que también está bastante roto en Linux: un retraso de un segundo antes de que se entregue mouseDown no funcionará, ya que el motivo por el que trato de cambiar el manejo de mouseUp a mouseDown es hacer que la interfaz de usuario se sienta más receptiva. –