Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用侦听器“currentTimeProperty”?JavaFX_Java_Time_Properties_Javafx_Listener - Fatal编程技术网

如何使用侦听器“currentTimeProperty”?JavaFX

如何使用侦听器“currentTimeProperty”?JavaFX,java,time,properties,javafx,listener,Java,Time,Properties,Javafx,Listener,我想向pathTransition.currentTimeProperty添加一个侦听器,当时间为250ms时,显示一个println 我试过这个: pathTransition2.currentTimeProperty().addListener(new ChangeListener<Duration>() { @Override public void changed(ObservableValue<? ex

我想向pathTransition.currentTimeProperty添加一个侦听器,当时间为250ms时,显示一个println

我试过这个:

pathTransition2.currentTimeProperty().addListener(new ChangeListener<Duration>() {

                @Override
                public void changed(ObservableValue<? extends Duration> observable, Duration oldValue, Duration newValue) {
                    if(newValue==Duration.millis(250))
                        System.out.println("250ms");
                }
                });
但是什么都没发生

我做错了什么


PD:这是一个例子,您的示例没有显示问题,完整的代码显示了问题。您在while循环中一次又一次地添加侦听器

除此之外,您不能检查newValue==Duration.millis250,因为如果您输出newValue变量,您会得到以下结果:

341.6666666666667 ms
378.5 ms
411.8333333333333 ms
441.1666666666667 ms
473.0 ms
487.1666666666667 ms
494.8333333333333 ms
505.1666666666667 ms
521.1666666666666 ms
537.1666666666666 ms
您需要检查250毫秒左右的增量

这是你修改过的代码。您遇到的问题是,currentTimeProperty在达到1000时先上升后下降,在达到0时上升,等等

下面是一个经过修改的代码示例:

import static javafx.animation.Animation.INDEFINITE;
import javafx.animation.PathTransition;
import javafx.animation.PathTransitionBuilder;
import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.scene.Scene;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.scene.shape.LineTo;
import javafx.scene.shape.MoveTo;
import javafx.scene.shape.Path;
import javafx.scene.shape.PathBuilder;
import javafx.stage.Stage;
import javafx.util.Duration;

/**
 *
 * @author Jose
 */
public class Listener extends Application {

    long prevTime = System.currentTimeMillis();

    @Override
    public void start(Stage primaryStage) {

        Circle circle = new Circle(50);

        Path path2 = PathBuilder.create().elements(new MoveTo(0, 0), new LineTo(0, 80)).build();
        path2.setFill(Color.RED);
        path2.setStroke(Color.RED);
        path2.setStrokeWidth(1);
        path2.setLayoutX(0);
        path2.setLayoutY(0);

        PathTransition pathTransition2 = PathTransitionBuilder.create().duration(javafx.util.Duration.millis(1000)).cycleCount(INDEFINITE).autoReverse(true).path(path2).node(circle).build();

        pathTransition2.currentTimeProperty().addListener(new ChangeListener<Duration>() {

            @Override
            public void changed(ObservableValue<? extends Duration> observable, Duration oldValue, Duration newValue) {

                long currTime = System.currentTimeMillis();
                if (Double.compare((currTime - prevTime), 250) > 0) {
                    System.out.println("delta: " + (currTime - prevTime) + ", old value: " + oldValue + ", new value: " + newValue);
                    prevTime = currTime;
                }

            }
        });

        pathTransition2.play();

        StackPane root = new StackPane();
        root.getChildren().addAll(path2, circle);

        Scene scene = new Scene(root, 300, 250);

        primaryStage.setScene(scene);
        primaryStage.show();

    }

    public static void main(String[] args) {
        launch(args);
    }

}
您可以创建布尔绑定并观察以下情况:

Duration quarterSecond = Duration.millis(250);
BooleanBinding afterQuarterSecond = Bindings.createBooleanBinding(() -> 
    pathTransition2.getCurrentTime().greaterThanOrEqualTo(quarterSecond), 
    pathTransition2.currentTimeProperty());
afterQuarterSecond.addListener((obs, wasAfter, isNowAfter) -> {
    if (isNowAfter) {
        System.out.println("250 ms...");
    }
});

Oldvalue=0和newValue=1000,newValue永远不会和250一样,你的应用程序陷入了一个循环中。谢谢你的回答@Xbit,你知道一种方法来判断过渡时间是在250ms吗?很高兴再次见到你@Roland!我从来没有使用过增量,你可以给出一些代码示例吗?当然,我编辑了这篇文章。请注意,我从不使用侦听器报告的值。你打算通过这件事实现什么是完全不同的事情-非常感谢。我的朋友@Roland Hahathan回答的另一个问题谢谢你的回答!很好,我将尝试一下您的代码:
Duration quarterSecond = Duration.millis(250);
BooleanBinding afterQuarterSecond = Bindings.createBooleanBinding(() -> 
    pathTransition2.getCurrentTime().greaterThanOrEqualTo(quarterSecond), 
    pathTransition2.currentTimeProperty());
afterQuarterSecond.addListener((obs, wasAfter, isNowAfter) -> {
    if (isNowAfter) {
        System.out.println("250 ms...");
    }
});