반응형
JavaFX UI 변경하기, 변경시 주의점. Not on FX application thread
JavaFX + Scenebuilder를 연동하여 사용할 때,
특정 이벤트에 따라 UI를 변경해야 할 경우가 있습니다.
예를들어, 이미지를 변경한다던지, Text를 변경한다던지 모두 UI 변경에 속합니다.
JavaFX 의 UI 변경은 JavaFX Application Thread가 담당을 하게 되는데,
다른 Thread에서 UI를 변경하게 되면 아래와 같은 Exception 이 발생하게 됩니다.
java.lang.IllegalStateException: Not on FX application thread; currentThread = pool-3-thread-2
[예시 코드1]
public static void printLogger(String msg) {
LOGGER.info(msg);
nomalTa.getChildren().add(new Text(getTime()+msg+"\n"));
}
위는 static으로 선언한 TextFow (nomalTa) 에 text를 추가하는 코드입니다.
이렇게 작성을 하면 위에서 말씀드린데로 IllegalStateException 이 발생을 하죠.
이를 해결 하기 위해서는 JavaFX에서 제공하는 Platform.runLater() 메소드를 사용합니다.
Platform.runLater() 메소드는 UI를 변경하는 Thread를 생성해 JavaFX Application Thread 가 처리 할 수 있게 Queue에 등록하는 기능을 합니다.
위의 [예시코드1]을 아래와 같이 수정합니다.
public static void printLogger(String msg) {
Platform.runLater(new Runnable() {
@Override
public void run() {
LOGGER.info(msg);
nomalTa.getChildren().add(new Text(getTime()+msg+"\n"));
}
});
}
Exception 없이 동작하는 것을 확인 하실 수 있습니다.
반응형
'Programing > JavaFX' 카테고리의 다른 글
JavaFX + SceneBuilder TextFlow 스크롤 추가 및 포커스 설정 (0) | 2019.10.29 |
---|---|
JavaFX Text style 변경 TextArea, TextFrow (0) | 2019.10.28 |
Springboot + JavaFX + SceneBuilder 새창열기 open new window (0) | 2019.10.25 |
Springboot + JavaFX + SceneBuilder menu 추가 방법 (0) | 2019.10.24 |
Springboot + JavaFX + SceneBuilder 연동하기 (0) | 2019.10.23 |
댓글