我有一个 JavaFX 应用程序,其中包含大约 20 个标签。当用户单击标签时,我需要标签闪烁红色。为了让标签变成红色,我使用了一个我为 swing 开发但转换为 JavaFX 的线程。它工作了一段时间,但我最近将应用程序锁定跟踪到标签的动画。我制作动画的方式很简单:
new Thread(new AnimateLabel(tl,idx)).start();
tl 指向标签的 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 共享线程时暂停运行以控制动画的速度?
问候,达斯汀