Tôi có một người nghe chuột. Nó có một số mã để trả lời các sự kiện mouseUp và mouseDown. Điều này hoạt động chính xác.Sự kiện MouseDown không được phân phối cho đến khi MouseUp khi có Nguồn Kéo
Tuy nhiên, ngay sau khi tôi thêm một DragSource, sự kiện mouseDown của tôi không còn được gửi nữa - cho đến khi tôi nhả chuột!
Điều này là tầm thường để tái tạo - dưới đây là một chương trình đơn giản có chứa một trình bao đơn giản chỉ với một người nghe chuột và một người nghe kéo. Khi tôi chạy (trên máy Mac), và tôi nhấn và giữ nút chuột, không có gì xảy ra - nhưng ngay sau khi tôi nhả nút chuột, tôi ngay lập tức nhìn thấy cả chuột và chuột lên các sự kiện được phân phối. Nếu tôi nhận xét ra nguồn kéo, thì các sự kiện chuột sẽ được phân phối theo cách của chúng.
Tôi đã tìm kiếm những người khác với vấn đề tương tự, và gần nhất tôi đã tìm thấy một lời giải thích là thế này:
https://bugs.eclipse.org/bugs/show_bug.cgi?id=26605#c16 "Nếu bạn treo kéo phát hiện, hệ điều hành cần phải ăn các sự kiện chuột cho đến khi nó xác định rằng bạn đã kéo hay không. "
Tuy nhiên, tôi không hiểu tại sao điều đó đúng - tại sao hệ điều hành lại phải ăn các sự kiện chuột để xác định xem tôi có kéo hay không? Kéo không bắt đầu cho đến khi tôi có một sự kiện chuột-chuột với nút được nhấn.
Quan trọng hơn: Có ai có thể đề xuất cách giải quyết khác không? (Tôi đã thử tự động thêm và xóa nguồn kéo của mình khi nhấn chuột, nhưng sau đó tôi không thể kéo thả & để hoạt động chính xác vì nó không bao giờ thấy phím bấm ban đầu - và tôi không thể tìm cách khởi tạo chương trình . drag)
đây là chương trình mẫu:
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();
}
}
Tôi đã thử và mã của bạn đang hoạt động trên Windows. Có thể là lỗi hệ điều hành cụ thể – nanda
Tôi vừa thử trên Ubuntu 10.04 và sắp xếp các tác phẩm. Nhấn nút chuột trái bạn sẽ không nhận được sự kiện nào. Di chuyển chuột bạn nhận được 'mouseDown' và' dragStart' * cùng một lúc *. Khi bạn cho phép bạn nhận được sự kiện 'mouseUp'. Nếu bạn giữ chuột vẫn còn và nhấn nút trái, bạn sẽ nhận được một 'mouseDown' sau một sự chậm trễ đáng chú ý 1-2 giây. Dù bằng cách nào, 'mouseDown' luôn được nhìn thấy trước khi buông chuột. Phải là một SWT trên máy Mac? – richq
Cảm ơn cả hai - có vẻ như đây chắc chắn là nền tảng cụ thể. Tuy nhiên, có vẻ như nó khá bị hỏng trên Linux quá - một giây chậm trễ trước khi mouseDown được phân phối sẽ không hoạt động vì lý do tôi đang cố gắng chuyển một số thao tác từ mouseUp sang mouseDown là làm cho giao diện người dùng cảm thấy nhạy hơn .. –