除了使用计时器之外,如何在自定义标签上创建闪烁效果?
这是我正在使用的一个可行的例子......
自定义标签类
public class CustomLabel extends Label{
public CustomLabel(String text1){
super(text1);
setAlignment(Pos.CENTER);
//for blinking effect
TIMER = new Timeline(
new KeyFrame(Duration.seconds(1),ae->ChangeColor1()),
new KeyFrame(Duration.seconds(2),ae->ChangeColor2())
);
TIMER.setCycleCount(Animation.INDEFINITE);
TIMER.play();
}
public void ChangeColor1(){
setTextFill(Color.Pink);
}
public void ChangeColor2(){
setTextFill(Color.Blue);
}
}
主要课程
StackPane sp = new StackPane(new CustomLabel("Testing"));
Scene sc = new Scene(sp)
primaryStage.setScene(sc)
sc.show();
有没有办法让这种方法"更轻"?
不知何故,此方法会在应用程序运行1天后导致错误
java.lang.NullPointerException
Exception in thread "JavaFX Application Thread" java.lang.OutOfMemoryError: Java heap space
有关如何解决这个问题的任何建议吗?此应用程序必须运行超过1整天。
答案 0 :(得分:1)
回复你的上述答案,(因为评论不允许使用代码块)这就是你需要这样做的方式,因为它能够"闪烁":
KeyFrame kfP = new KeyFrame(Duration.seconds(1), new KeyValue(ae.textFillProperty(), Color.PINK));
Timeline TIMER = new Timeline();
TIMER.getKeyFrames().add(kfP);
TIMER.setCycleCount(Animation.INDEFINITE);
TIMER.setAutoReverse(true);
TIMER.play();
这样做的原因是你只创建一个关键帧,它只使用一个关键帧,这会阻止时间线创建多个新关键帧,就像在初始代码中一样,并且时间轴继续运行它不会收集垃圾,直到你的内存不足为止。