如标题所示,用户将文件放在目标上。这应该会触发一个不太立即的操作,比如需要 4 秒。
问题是系统用来表示被拖动项目的图标一直停留在窗口上,直到操作完成并且void handle(DragEvent d)
事件返回。
这被用户感知为应用程序“冻结”。我们知道应用程序需要 4 秒来处理拖放的项目,但是如果用户在目标上释放项目后和4 秒操作开始之前图标立即消失,用户可能根本不会注意到这一点。
这是与丢弃相关的代码:
s.setOnDragDropped(new EventHandler<DragEvent>() {
@Override public void handle(DragEvent t) {
//1. The drop is OK
t.setDropCompleted(true);
//<--I THINK THAT SOMETHING SHOULD BE PUT HERE TO FORCE D&D TO REMOVE THE ICON
//2. let's start an elaboration that involves the files
// that have been dropped!
try { Thread.sleep(4000); } catch (InterruptedException ignore_exception_in_test) {}
}
});
有没有办法解决这个问题?
完整的代码,如果你只是想重现案例;只需修复导入并将文件从资源管理器拖放到舞台上。
public class ShortSelfCompilableExample01 extends Application {
Stage stage;
@Override public void start(Stage stage) throws Exception {
stage.setTitle("Drag&Drop test");
this.stage = stage;
Scene s = new Scene(new BorderPane());
stage.setScene(s);
s.setOnDragDropped(new EventHandler<DragEvent>() {
@Override public void handle(DragEvent t) {
//1. Ok, the drop is OK
t.setDropCompleted(true);
//2. let's start an elaboration that involves the files
// that have been dropped!
try {
Thread.sleep(6000);
} catch (InterruptedException ignore_exception_in_test_environments) {}
}
});
s.setOnDragOver(new EventHandler<DragEvent> () {
@Override public void handle(DragEvent t) {
t.acceptTransferModes(TransferMode.ANY);
}
});
stage.show();
}
}
PS。为什么我没有使用线程
响应式 UI 的“一流”解决方案是使用线程。但这不是执行时间很长的后台任务。这在最坏的情况下应该持续 5 秒,而线程会引入一定程度的复杂性。操作的长度越短,为了“平滑” UI 而引入线程就越不方便。