HOWTO · Java
Java의 FX 응용 프로그램 스레드에 없음
이 자습서는 Java의 Not on FX 응용 프로그램 스레드 오류를 보여줍니다.
이 자습서는 Java의 FX 응용 프로그램 스레드에 없음 오류를 보여줍니다.
Java의 FX 애플리케이션 스레드에 없음
Not on FX application thread 오류는 FX 스레드가 아니고 FX 스레드에서 호출해야 하는 스레드에서 메서드를 호출하려고 할 때 발생합니다. 이것은 이전 버전의 JavaFX에서는 문제가 되지 않았습니다.
JavaFX 8의 새로운 구현에서 발생합니다. 이 오류는 JavaFX 응용 프로그램의 다른 스레드에서 사용자 인터페이스를 변경할 때 발생합니다.
다음은 Not on FX application thread 오류를 발생시키는 예입니다.
Thread DemoThreadShow = new Thread(new Runnable() {
@Override
public void run() {
try {
newthread.setStyle("visibility: true");
Thread.sleep(10000);
Thread.interrupted();
} catch (Exception e) {
thread.setText("" + Integer.valueOf(thread.getText()) + 5);
newthread.setStyle("visibility: false");
}
}
});
DemoThreadShow.start();
위의 코드는 스레드를 만들고 해당 스레드에 몇 가지 메서드를 적용합니다. 이러한 메서드는 JavaFX 응용 프로그램에서 가져온 것입니다.
setText 메소드를 적용할 때 스레드 "Thread-5" java.lang.IllegalStateException의 예외: FX 애플리케이션 스레드에 없음; 오류가 발생합니다. currentThread = 스레드-5.
이 문제를 해결하기 위해 코드를 다음과 같이 변경할 수 있습니다.
-
FX 어플리케이션 및 스레드 작업 중 UI를 변경하려면 다음 방법을 사용합니다.
Platform.runLater(() -> { // GUI STUFF }); or : Platform.runLater(new Runnable() { @Override public void run() { // GUI STUFF } }); -
Thread대신Service및Task를 사용할 수도 있습니다.서비스에는스레드보다 더 많은 기능이 있습니다.작업 내에서 UI를 변경해도
FX 응용 프로그램 스레드에 없음오류가 발생하지 않습니다. 다음은 이를 위해Service및Task를 사용하는 코드 예제입니다.Service New_Service = new Service() { @Override protected Task createTask() { return new Task() { @Override protected Object call() throws Exception { Platform.runLater(() -> { // GUI stuff here }); return null; } }; } }; New_Service.start();위의 코드는 스레드보다 편리한 방법입니다.