当前位置: 首页 > 面试题库 >

如何等待转换在javafx 2.1中结束?

锺离声
2023-03-14
问题内容

我的场景仅包含一个ImageView,显示一个图像。我想将图像淡化为黑色(场景的指定颜色),然后过一段时间后,再次从黑色淡入图像。我发现FadeTransition非常适合此目的。这是我的一部分代码:

    // fade to black transition
    FadeTransition ft1 = new FadeTransition(Duration.millis(2000), myImageView);
    ft1.setFromValue(1.0);
    ft1.setToValue(0.0);
    ft1.play();

    // fade from black transition
    FadeTransition ft2 = new FadeTransition(Duration.millis(2000), myImageView);
    ft2.setFromValue(0.0);
    ft2.setToValue(1.0);
    ft2.play();

我的问题是ft1.play()异步的,因此下面的代码将在ft1.play()退出之前开始执行。结果,我只看到第二个过渡。如何等待第一个过渡结束,然后启动第二个过渡?我无法让线程在两者之间进入睡眠状态,因为它是主要的javafx线程(尝试过并且无法正常工作)。

我尝试将onFinishedProperty()方法与标志上的忙等待组合使用,但是我永远陷入了while循环中。这是我的代码:

    boolean isTransitionPlaying;
    FadeTransition ft = new FadeTransition(Duration.millis(2000), iv);
    ft.setFromValue(1.0);
    ft.setToValue(0.0);
    ft.onFinishedProperty().set(new EventHandler<ActionEvent>() {
        @Override 
        public void handle(ActionEvent actionEvent) {
            transitionPlaying = false;
        }
    });
    transitionPlaying = true;
    ft.play();

    while (transitionPlaying == true)
    {
        // busy wait
        System.out.println("still waiting...");
    }

    FadeTransition ft2 = new FadeTransition(Duration.millis(2000), iv);
    ft2.setFromValue(0.0);
    ft2.setToValue(1.0);
    ft2.play();

等待如何正确完成?谢谢


问题答案:

在JavaFX应用程序线程上忙于等待(甚至Thread.sleep)始终是一个坏主意-
您将负责处理UI处理的线程捆绑在一起,以便您的过渡以及UI的其余部分都不会更新-
有效地冻结了您的忙碌等待期间的应用程序用户界面。对于响应式UI,您需要尽快在FX应用程序线程上运行逻辑,然后放开线程,以便JavaFX系统的其余部分可以继续进行处理。这就是过渡具有异步回调的原因-
一旦您习惯了它们,这便是一种非常自然的开发方式。


除了Uluk的解决方案(很棒的解决方案)之外,您还可以查看SequentialTransition类,以处理按顺序执行过渡的协助。请注意,如果您想在SequentialTransition完成后采取行动,您仍将需要向onSequentialTransition添加onFinished处理函数以在此时采取行动。



 类似资料:
  • 问题内容: 是否可以在特定路由上调用称为a的异步redux操作,并且在响应成功或失败之前不执行转换? 用例 我们需要从服务器加载数据并用初始值填写表单。从服务器获取数据之前,这些初始值不存在。 像这样的一些语法会很棒: 问题答案: 要回答防止在响应成功或失败之前过渡到新路线的原始问题,请执行以下操作: 因为您使用的是redux thunk,所以操作创建者成功或失败可能会触发重定向。我不知道您的特定

  • 问题内容: 我试图让Selenium等待页面加载后动态添加到DOM的元素。试过这个: 如果有帮助,这里是: 但是它抛出一个-看起来像期望元素存在,所以这是有缺陷的。这一定是Selenium的面包和黄油,不想重新发明轮子……任何人都可以提出其他选择,理想情况下不用自己动手做? 问题答案: 需要等待时,您需要异常调用以忽略。 有关更多信息,请参见FluentWait文档。但是请注意,此条件已经在Exp

  • 问题内容: PHP会以1-2秒的延迟返回值jQuery.post不等待响应。 您如何看待,是否有可能解决该问题并等待响应? 注意 与get相同的功能效果很好 问题答案: $ .post是异步的,您需要使用$ .ajax并将async设置为false,这样您就可以等待响应。您可以在此处了解更多信息: http //api.jquery.com/jQuery.ajax/

  • 有没有更好的写法呢?由于某种原因,我真的需要这个循环吗?(似乎与有关)

  • 问题内容: 我已经设置了索引。我不时向其推送新文档。 我只想在所有文档都编入索引后回答我的查询。我怎样才能做到这一点? 问题答案: 在ES 2中,您可以在为新文档建立索引后立即调用API,但是不建议在生产环境中使用它,因为这可能会降低群集的性能。 在ES5中,您将能够使用发送索引查询,并且ES仅在准备好搜索新文档时才响应。

  • 我目前是Jmeter的新手,正在尝试创建一个Jmeter脚本来测试处理和完成请求所需的时间。 a)使用令牌进行身份验证-完成b)发送请求-完成-返回200 c)获取请求-部分完成 C:我正试图得到能够监控这个请求,以找出它什么时候完成,失败等等。 我从研究JSR223采样器开始,但想看看是否有更好更简单的方法来实现这一点。 列表sendGet(字符串url,map 正文){