Programing/JavaFX

JavaFX UI변경하기, 변경시 주의점. Not on FX application thread

리커니 2019. 10. 28.
반응형

 

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 없이 동작하는 것을 확인 하실 수 있습니다.

 

 

반응형

댓글

💲 추천 글