Ich habe einen Maus-Listener. Es gibt Code, der auf MouseUp- und MouseDown-Ereignisse reagiert. Dies funktioniert korrekt.MouseDown-Ereignisse werden erst ausgegeben, wenn MouseUp eine Drag-Quelle enthält
Sobald ich jedoch eine DragSource hinzufüge, wird mein mouseDown Event nicht mehr geliefert - bis ich die Maustaste loslasse!
Dies ist trivial zu reproduzieren - unten ist ein einfaches Programm, das eine einfache Shell mit nur einem Maus-Listener und einem Drag-Listener enthält. Wenn ich das (auf einem Mac) ausführe und die Maustaste drücke und halte, passiert nichts - aber sobald ich die Maustaste loslasse, sehe ich sofort sowohl die Mouse-Down- als auch Mouse-Up-Ereignisse. Wenn ich die Ziehquelle auskommentiere, werden die Mausereignisse so geliefert, wie sie sein sollten.
Ich habe für andere mit ähnlichen Problemen gesucht, und die nächste, die ich auf eine Erklärung gefunden habe, ist dies:
https://bugs.eclipse.org/bugs/show_bug.cgi?id=26605#c16 „Wenn Sie ziehen erkennen Haken, das Betriebssystem benötigt, bis es Mausereignisse essen bestimmt, dass Sie entweder gezogen haben oder nicht. "
Allerdings verstehe ich nicht, warum das stimmt - warum muss das Betriebssystem Mausereignisse essen, um festzustellen, ob ich einen Widerstand habe oder nicht? Der Drag startet erst, wenn ich bei gedrückter Taste ein Maus-Bewegungsereignis habe.
Noch wichtiger: Kann jemand einen Workaround vorschlagen? (Ich habe versucht, meine Ziehquelle dynamisch hinzuzufügen und zu entfernen, wenn die Maus gedrückt wird, aber dann konnte ich nicht ziehen & drop um richtig zu funktionieren, da es nie den ersten Tastendruck sah - und ich kann keinen Weg finden, programmgesteuert zu initiieren . drag)
Hier ist das Beispielprogramm:
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();
}
}
Ich habe es versucht und Ihr Code funktioniert unter Windows. Könnte OS-spezifischen Fehler sein – nanda
Ich habe gerade dies auf Ubuntu 10.04 versucht und es funktioniert irgendwie. Drücken Sie die linke Maustaste, Sie erhalten kein Ereignis. Bewegen Sie die Maus und Sie erhalten 'mouseDown' und' dragStart' * gleichzeitig *. Wenn Sie loslassen, erhalten Sie das 'mouseUp'-Ereignis. Wenn Sie die Maus ruhig halten und den linken Knopf drücken, erhalten Sie nach einer spürbaren Verzögerung von 1-2 Sekunden einen "mouseDown". In beiden Fällen wird 'mouseDown' immer vor dem Loslassen der Maus angezeigt. Muss ein SWT bei Mac Problem sein? – richq
Danke euch beiden - es klingt, als wäre das definitiv plattformspezifisch. Es klingt jedoch so, als wäre es auch unter Linux ziemlich kaputt - eine Sekunde Verzögerung, bevor mouseDown geliefert wird, wird nicht funktionieren, da ich versuche, etwas von mouseUp auf mouseDown umzustellen, um die Benutzeroberfläche ansprechender zu machen. –