代码之家  ›  专栏  ›  技术社区  ›  IdiotDrake

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

  •  0
  • IdiotDrake  · 技术社区  · 6 年前

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

    问题: 正如我将在构建时间线的方法中发布的一样,屏幕上有一个从右向左转换的文本元素。在头一两个小时内,这一切都如期进行,但过了一段时间,情况变得越来越紧张。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;
                }
            }
        }
    }
    

    Scrolling Text Picture

    1 回复  |  直到 6 年前
        1
  •  0
  •   IdiotDrake    6 年前

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

    不要使用窗格。清除();如果有动画,请使用LowerGrid。getChildren()。removeAll();