当前位置: 首页 > 知识库问答 >
问题:

JavaFX Timeline动画在几个小时后会结巴

桑博远
2023-03-14

前言:所以我有这个,其实应用程序并不是那么重要,它是一个tcp侦听器,整天用一些硬件聊天。但它也有一些展示的东西。显示屏在屏幕的不同区域显示不同的自定义节点,屏幕底部是一个网格,显示一些“东西”,但当没有任何“东西”时,它会在屏幕上滚动一些文本。

问题:正如我将在我构建时间线的方法中发布的那样,有一个Text元素可以在整个屏幕上从右向左过渡。这在第一个小时或可能两个小时内按预期工作,但过了一段时间后,它会逐渐变得更加紧张。TCP侦听器仍然很敏捷,它产生的线程在进出控制器和更改UI时没有任何麻烦,但该滚动文本在它显示的55"屏幕上一次像2英寸一样跳跃。我真的需要一种方法让文本像我第一次启动应用程序时一样流畅地滚动无限期的时间。

private void buildChyron() throws IllegalArgumentException {
    setMessages();
    LowerGrid.getChildren().clear();
    StringBuilder txtstr = new StringBuilder();
    for (String s : messages) {
        txtstr.append(s).append("                           ");
    }
    txtstr = new StringBuilder(txtstr.toString().trim());
    Text msg = new Text(txtstr.toString());

    LowerGrid.add(msg, 0, 0);
    msg.setTextOrigin(VPos.TOP);
    msg.setFont(Font.font("Veranda", FontWeight.BOLD, 150));

    double sceneWidth = MainGrid.getWidth();
    double msgWidth = msg.getLayoutBounds().getWidth();

    KeyValue initKeyValue = new KeyValue(msg.translateXProperty(), sceneWidth);
    KeyFrame initFrame = new KeyFrame(Duration.ZERO, initKeyValue);
    KeyValue endKeyValue = new KeyValue(msg.translateXProperty(), -1.0 * msgWidth);
    KeyFrame endFrame = new KeyFrame(Duration.seconds((msgWidth + sceneWidth) / messageRate), endKeyValue);
    if ((timeline != null) && (timeline.getStatus().equals(Timeline.Status.PAUSED))) {
        timeline.playFromStart();
    } else {
        timeline = new Timeline(initFrame, endFrame);
        timeline.setCycleCount(Timeline.INDEFINITE);
        if (msgIndex == messages.size() - 1) msgIndex = 0;
        else msgIndex++;
        timeline.playFromStart();
    }
}

这是我调用这个东西的地方,正如你所看到的,我一直在尝试尝试它,认为这可能是硬件资源问题,但我无法控制它。我现在正在测试这个东西,它在我所在的设施中处于超级可见的位置。超级尴尬

private void updateStack() {
    int count = 0;
    System.out.println(andonStack);
    andonStack.sortStack();
    LowerGrid.getChildren().clear();
    if (pokeyStack.size() > 0) {
        AndonPane pane = new AndonPane(pokeyStack.get(0).getPokayo());
        LowerGrid.add(pane, 0, 0, 9, 1);
    } else {

        int i;
        for (i = 0; i < andonStack.size(); i++) {
            if (i >= 9) break;
            panes[i] = new AndonPane(((AndonSignalStack.AndonSignal) andonStack.get(i)).getType(),
                    ((AndonSignalStack.AndonSignal) andonStack.get(i)).getStation(), this);
            count++;
        }
        for (; i < 9; i++) {
            panes[i] = new Pane();
            panes[i].setStyle("-fx-background-color: rgba(0,0,0, 0)");
            panes[i].setPrefWidth(MainGrid.getWidth() * (9 - i) / 9);
        }
        for (i = 0; i < count; i++) {
            LowerGrid.add(panes[i], i, 0);
        }
        if (i == 0) {
            Platform.runLater(this::buildChyron);
        }else{
            if (timeline != null) {
                System.gc();
                timeline.stop();
                timeline = null;
            }
        }
    }
}

滚动文本图片

共有1个答案

穆单鹗
2023-03-14

答案是窗格中设置的clear方法。需要停止并删除动画

不要使用窗格。清除();当有动画时,使用LowerGrid。getChildren()。removeAll();

 类似资料:
  • 问题内容: 如何在几天,几小时,几周或几个月后迭代一个时间跨度? 就像是: 其中foo是一个函数,返回一个迭代器。我一直在研究日历模块,但是它仅适用于特定的一年或一个月,不适用于日期之间。 问题答案: 使用dateutil及其rrule实现,如下所示: 输出为 将“每月”替换为“每年”,“每月”,“每周”,“每天”,“每小时”,“半年”或“第二”。替换dtstart,直到您想要的任何datetim

  • 问题内容: 我的动画是从右向左移动的图像,这是一个周期。我想知道如果我必须开始几个周期,如果我想让几个图像一个接一个地从右向左移动,该怎么办。目前,我计算一个周期并更新我的组件的AX值,并以0 +此X值绘制图像。如果我必须处理几个周期,我该如何跟踪我必须绘制的每个图像的x值?谢谢。 问题答案: 例如(达里尔)

  • 本文向大家介绍loading动画特效小结,包括了loading动画特效小结的使用技巧和注意事项,需要的朋友参考一下 话不多说,请看代码 以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持呐喊教程!

  • 我想知道为什么chrome正在关闭,而其他进程正在工作?

  • 使用的解决方案类似于microsoft文档中的内容:https://docs.microsoft.com/en-us/dotnet/api/microsoft.azure.documents.linq.documentQueryable.asdocumentQuery?view=azure-dotnet 我们目前正在将我们的数据解决方案转移到cosmosDB,这就是我们如何注意到这个问题的。你知道

  • 问题内容: 我现在正在制作CSS动画,在其中我正在移动内容并希望它停留在最终位置,直到用户将鼠标移开为止。 无论何时动画结束,它都会重复播放。我只希望它发生一次并保持原样,直到用户离开。我尝试使用规范中已暂停的内容,但此功能无法正常运行。任何帮助表示赞赏。谢谢。:) 问题答案: 以下评论对我有用。谢谢迈克尔 “您需要添加填充模式以在动画结束时冻结动画状态。 使动画处于最后一帧的状态 在开始时保留动