JavaFX 응용 프로그램이 있습니다. 약 20 개의 레이블이 있습니다. 사용자가 라벨을 클릭하면 빨간색으로 깜박이는 라벨이 필요합니다. 레이블을 빨간색으로 깜박이려면 실제로 스윙 용으로 개발했지만 JavaFX로 변환 된 스레드를 사용하고 있습니다. 그것은 잠시 동안 일 했었지만 최근에 응용 프로그램 잠금을 추적하여 레이블의 애니메이션을 추적했습니다.Java FX 스레드 안전 일시 중지/수면
new Thread(new AnimateLabel(tl,idx)).start();
TL 포인트 그것의 인덱스에 라벨의 ArrayList를하고, IDX에 : 나는 애니메이션을했던 방법은 간단했다. 다른 레이블에는 클릭 이벤트가 첨부되어 있으며이를 클릭하면 레이블에 애니메이션을 적용하는 스레드가 만들어집니다 (깜박입니다).
많은 이유 때문에 레이블을 많이 누르면 응용 프로그램이 잠길 수 있습니다.
저는 JavaFX의 스레드 안전성 문제라고 확신합니다.
TimerUpdater tu = new TimerUpdater(mDS);
Timeline incHandler = new Timeline(new KeyFrame(Duration.millis(130),tu));
incHandler.setCycleCount(Timeline.INDEFINITE);
incHandler.play();
TimerUpdater 끊임없이 라벨, 깜박이도 사람의 텍스트를 업데이트합니다 : 나는 그래서 자바 FX 애플리케이션 스레드를 공유하는 다른 스레드가 있습니다.
이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을 사용하여 스레드를 공유하면서 나중에 애니메이션의 속도를 제어하기 위해 잠시 멈출 수있는 방법이 있습니까?
안부, 더스틴
난 그냥 모든 16millis 1 개 루프를 할 경우 Thread.sleep를 제거하고에 루프를 다시받을 생각 그것을 그대로 수용하면 효과가 있습니다. 시도 할 시간이 없지만 알려 드리겠습니다. Transition을 지적 해 주셔서 고맙습니다. 움직이는 데 사용 된 FX 클래스를 찾고있을 때 다시 찾지 못했습니다. 그리고 이것은 확실히 더 나은 접근 방법입니다. – SigSeg