2017-01-24 1 views
0

스레드를 사용하여 AnchorPane의 불투명도를 변경합니다. 점진적으로 불투명도를 높이려면 onMouseEnter 메서드를 추가하고 점진적으로 불투명도를 줄이려면 onMouseExited 메서드를 추가합니다. 두 개의 창이 있습니다. 내 마우스 중 하나를 입력하면 두 개의 창 모두 불투명도가 변경됩니다. 그런 다음 응용 프로그램을 시작한 후 마우스를 몇 번 입력하고 나가면 특정 불투명도에서 멈추고 나머지는 여전히 불투명도를 변경합니다. 나는 이런 일이 왜 혼란 스러워요 ... 내 코드는 같은 수 있습니다 :javafx setOpacity 메서드가 일부 시간 반복 될 때 작동하지 않습니다.

private double base = 0.5; 

private void changeOpacity(boolean increase){ 
    new Thread(()-> { 
    while((increase && base < 0.9) || ((!increase)&&base > 0.5)){ 
     base += increase?0.01:-0.01; 
     leftPane.setOpacity(base); 
     rightPane.setOpacity(base); 
     Thread.sleep(5); 
    } 
} 
} 

나는 불쌍한 내 영어 죄송합니다. 고맙습니다.

+0

변수는 스레드 로컬 캐시 (A ParallelTransition와 함께) 키 프레임

  • 사용하여 이미 사전 정의 된 FadeTransition의 foreach는 노드를 타임 라인을 사용합니다. 'base'필드를 비동기 적으로 수정하는 스레드를 거의 실행하지 않으면 모든 스레드에서 동일한 값을 가질 것이라고 보장 할 수 없습니다. 그것에 '휘발성 (volatile)'키워드를 추가하고 무슨 일이 일어나는지보십시오. – Dth

  • +0

    UI를 백그라운드 스레드에서 변경할 수 없습니다. 당신은'Platform.runLater (...)'에서'setOpacity (...)'호출을 래핑 할 필요가있다. 하지만이 작업을 위해 [FadeTransition'] (http://docs.oracle.com/javase/8/javafx/api/javafx/animation/FadeTransition.html)을 사용하면 안됩니다. 첫 번째 장소에서 배경 스레드)? –

    답변

    1

    JavaFX 스레드를 사용하는 동안 JavaFX 구성 요소의 값만 변경할 수 있습니다 (분명히 아닙니다).

    Platform.runLater(Runnable)을 사용하여 자신을 다시 동기화해야하지만, 경우에 따라 이벤트 루프를 Runnables와 바꾸는 것이 좋습니다.

    올바른 방법은 다음과 같습니다

    관련 문제