我有一個JavaFX應用程序,它內有大約20個標籤。當用戶點擊標籤時,我需要標籤閃爍紅色。爲了使標籤閃爍紅色,我使用的是我實際爲swing開發的線程,但轉換爲JavaFX。它工作了一段時間,但我最近將應用程序鎖定追蹤到標籤的動畫。我做動畫的方式很簡單:Java FX線程安全暫停/休眠
new Thread(new AnimateLabel(tl,idx)).start();
t1指向一個ArrayList的標籤,idx指向它的索引。另一個標籤有一個點擊事件附加到它,當你點擊,它創建線程動畫標籤(使其閃爍)。
出於某種原因,這會導致應用程序鎖定,如果有被壓了很多標籤。
我敢肯定這是一個線程安全問題的JavaFX。我有另一個線程共享JavaFX應用程序線程像這樣:
TimerUpdater tu = new TimerUpdater(mDS);
Timeline incHandler = new Timeline(new KeyFrame(Duration.millis(130),tu));
incHandler.setCycleCount(Timeline.INDEFINITE);
incHandler.play();
TimerUpdater會不斷更新標籤,即使是閃爍的那些文字。
這裏的標籤動畫師:
private class AnimateLabel implements Runnable
{
private Label lbl;
public AnimateLabel(Label lbl, int myIndex)
{
// if inAnimation.get(myIndex) changes from myAnim's value, stop,
// another animation is taking over
this.lbl = lbl;
}
@Override
public void run() {
int r, b, g;
r=255;
b=0;
g=0;
int i = 0;
while(b <= 255 && g <= 255)
{
RGB rgb = getBackgroundStyle(lbl.getStyle());
if(rgb != null)
{
if(rgb.g < g-16) { return; }
}
lbl.setStyle("-fx-color: #000; -fx-background-color: rgb("+r+","+g+","+b+");");
try { Thread.sleep(6); }
catch (Exception e){}
b += 4;
g += 4;
++i;
}
lbl.setStyle("-fx-color: #000; -fx-background-color: fff;");
}
}
我會運行此這樣:
javafx.application.Platform.runLater(new AnimateLabel(tl, idx));
然而,的Thread.sleep(6)將被忽略。有沒有辦法在稍後的運行中暫停以控制動畫的速度,同時與javafx.application共享線程?
問候, 達斯汀
我想如果我只是做1個循環每16millis,擺脫了Thread.Sleep,並改寫環路如此容納它,它將起作用。沒有時間嘗試,但我會讓你知道。感謝您指出Transition,當我尋找用於製作動畫的FX類時,我沒有找到這種方式,這當然是更好的方法...... – SigSeg