Ho un listener di mouse. Ha del codice per rispondere agli eventi mouseUp e mouseDown. Funziona correttamenteGli eventi MouseDown non vengono recapitati fino a MouseUp quando è presente una sorgente di trascinamento
Tuttavia, non appena aggiungo un DragSource, il mio evento mouseDown non viene più recapitato - finché non rilascio il pulsante del mouse!
Questo è banale da riprodurre: di seguito è un semplice programma che contiene una semplice shell con un semplice listener di mouse e un ascoltatore di trascinamento. Quando eseguo questo (su un Mac), e premo e tengo premuto il pulsante del mouse, non succede nulla, ma non appena rilascio il pulsante del mouse, vedo immediatamente sia gli eventi del mouse che quelli del mouse consegnati. Se commento la sorgente di trascinamento, gli eventi del mouse vengono consegnati nel modo in cui dovrebbero essere.
Ho cercato per gli altri con problemi simili, e la più vicina che ho trovato per una spiegazione è questa:
https://bugs.eclipse.org/bugs/show_bug.cgi?id=26605#c16 "Se si collega la resistenza di rilevare, il sistema operativo ha bisogno di mangiare gli eventi del mouse fino a quando non determina che hai trascinato o meno. "
Tuttavia, non capisco perché sia vero - perché il sistema operativo deve mangiare gli eventi del mouse per determinare se ho una resistenza o no? Il trascinamento non si avvia finché non si verifica un evento del mouse -move- con il pulsante premuto.
Ancora più importante: qualcuno può suggerire una soluzione alternativa? (Ho provato ad aggiungere e rimuovere dinamicamente la mia sorgente di trascinamento quando si preme il mouse, ma non riesco a ottenere il trascinamento di & rilascio perché non ha mai visto la pressione iniziale del tasto - e non riesco a trovare un modo per avviare a livello di programmazione . trascinare)
Ecco il programma di esempio:
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();
}
}
Ho provato e il tuo codice funziona su Windows. Potrebbe essere un bug specifico del sistema operativo – nanda
Ho appena provato questo su Ubuntu 10.04 e funziona in modo ordinario. Premi il tasto sinistro del mouse per ottenere nessun evento. Muovi il mouse e ottieni 'mouseDown' e' dragStart' * allo stesso tempo *. Quando si rilascia, si ottiene l'evento 'mouseUp'. Se si tiene il mouse fermo e si preme il pulsante sinistro, si ottiene un 'mouseDown' dopo un ritardo di 1-2 secondi evidente. Ad ogni modo, 'mouseDown' è sempre visto prima di lasciar andare il mouse. Deve essere un problema SWT su Mac? – richq
Grazie a entrambi - sembra che questo sia decisamente specifico per la piattaforma. Tuttavia, sembra che sia anche piuttosto rotto su Linux - un secondo di ritardo prima del rilascio di mouseDown non funzionerà dato che il motivo per cui sto provando a passare un po 'di gestione da mouseUp a mouseDown è rendere l'interfaccia utente più reattiva. –