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.

이 문제를 해결하기 위해 코드를 다음과 같이 변경할 수 있습니다.

  1. FX 어플리케이션 및 스레드 작업 중 UI를 변경하려면 다음 방법을 사용합니다.

    Platform.runLater(()
                          -> {
                              // GUI STUFF
                          });
    
    or :
    
        Platform.runLater(new Runnable() {
          @Override
          public void run() {
            // GUI STUFF
          }
        });
    
  2. Thread 대신 ServiceTask를 사용할 수도 있습니다. 서비스에는 스레드보다 더 많은 기능이 있습니다.

    작업 내에서 UI를 변경해도 FX 응용 프로그램 스레드에 없음 오류가 발생하지 않습니다. 다음은 이를 위해 ServiceTask를 사용하는 코드 예제입니다.

    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();
    

    위의 코드는 스레드보다 편리한 방법입니다.