私は 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 とスレッドを共有しているときにアニメーションの速度を制御するために後で実行を一時停止する方法はありますか?
よろしく、 ダスティン