2017-02-28 57 views
0

除了使用計時器以外,如何在自定義標籤上創建閃爍效果?JAVAFX還有什麼其他方式可以讓標籤閃爍,而不是使用時間軸?

下面是我使用的一個可行的例子...

自定義標籤類

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(); 

有什麼辦法使這種方法「打火機」?

不知怎的,這種方法會導致下保持一整天

java.lang.NullPointerException 
Exception in thread "JavaFX Application Thread" java.lang.OutOfMemoryError: Java heap space 

如何解決這個任何建議在運行應用程序後的錯誤?這個應用程序需要運行超過1整天。

+1

好吧,這很有趣...你只需運行你發佈的代碼即可獲得OOME?如果是這樣,那是一個錯誤。 –

+0

您可以在時間軸上設置autoReverse,因此您不必設置兩種顏色。 'TIMER.setAutoReverse(true);'它也有可能是因爲它不停地運行新的關鍵幀,所以它沒有機會進入回收站它將填滿內存,可能只是一個非常大的cycleCount可能成爲答案(如果它的按鈕可能會讓它在按鈕上放置一整天?) – TravisF

+0

@James_D yup,最初當我的應用程序沒有這種閃爍效果時,它可以運行幾天沒有任何錯誤拋出。 – Ronaldo

回答

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(); 

的這樣做的理由是你只創建一個關鍵幀,它只使用一個關鍵幀,這將停止創建多個新關鍵幀的時間線,就像它在初始代碼中一樣,並且隨着時間線的繼續運行,它不會收集到垃圾它只是建立,直到你的內存不足。

相關問題