首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >javafx:当拖放操作的完成触发“长”任务时,d&d图标将在目标上持续存在。

javafx:当拖放操作的完成触发“长”任务时,d&d图标将在目标上持续存在。
EN

Stack Overflow用户
提问于 2013-09-11 17:48:49
回答 1查看 907关注 0票数 1

与标题一样,用户会在目标上删除一个文件。这应该会触发一个不太直接的操作,比如说需要4秒。

问题是,系统用来表示拖放的项目的图标停留在窗口上,直到操作完成,并且void handle(DragEvent d) 事件返回.

用户认为这是一个“冻结”应用程序。我们知道应用程序需要4秒来处理被删除的项,但是如果用户在目标上释放项之后,在4秒操作开始之前,图标立即消失,那么用户可能根本不会注意到这一点。

下面是与删除相关的代码:

代码语言:javascript
复制
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) {}

        }
    });

有什么办法来解决这个问题吗?

完整的代码,如果您只想再现大小写,只需修复导入并将一个文件从资源管理器放到阶段。

代码语言:javascript
复制
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就越不方便地引入线程。

EN

回答 1

Stack Overflow用户

发布于 2013-09-12 19:48:01

发生这种情况的原因:问题在于DnD的设计。它依赖于平台,但通常操作系统会调用一些方法,即传播到JavaFX并在事件处理程序中结束。此方法应该返回DnD操作的结果,以便操作系统能够知道该做什么。因此,在设计上是同步的。

应该做什么:使用另一个线程的建议可能是处理此问题的唯一方法。应该非常简单:在事件处理程序中获取长操作所需的所有信息,启动一个新线程,在那里执行长操作,并使用Platform.runLater更新UI。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18747976

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档