2014-09-16 2 views
0

내가 뭘 하려는지 버튼을 클릭 한 후에도 실시간으로 텍스트 영역에 텍스트를 인쇄하는 것입니다. 청취자가 JavaFX에서 멈추지 않고 실행되도록하는 방법은 무엇입니까?

버튼을 클릭하면 작업이 끝날 때까지 UI가 멈추고 그 후에 은 System.out.println과 달리 모든 텍스트를 함께 인쇄합니다.

아래 코드는 내가 시도한 것으로 예상 한대로 작동하지 않습니다. UI가 멈추고 텍스트 영역에 '테스트'가 표시되지 않습니다.

청취자를 사용할 필요가 없으며 appendText 만 사용하는 것이 좋습니다. 하지만 UI의 동결없이 버튼의 ActionEvent가 작동하게하는 방법을 알 수 없습니다.

나는 정말로 당신의 도움이나 훨씬 더 좋은 코드를 주셔서 감사합니다 !!

final TextField announcement = new TextField(); 
    Platform.runLater(new Runnable() { 
     @Override public void run() { 
      announcement.textProperty().addListener(new javafx.beans.value.ChangeListener<String>() { 
         public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) { 
         textoutput.appendText(announcement.getText()); 
         } 
      }); 
     } 
    }); 

btn.setOnAction(new EventHandler<ActionEvent>() { 
    @Override 
     public void handle(ActionEvent event) { 
      announcement.setText("test"); 
      // bunch of codes below 
     } 
}); 
+0

새 스레드에서 Button의 액션에서 무엇을 하든지 실행해야합니다. 이를 달성하기 위해'JavaFX Task'를 사용할 수 있습니다. – ItachiUchiha

+0

@ItachiUchiha 가능한 경우 나에게 예제를 제공해 주시겠습니까? 고맙습니다. – Keibee

답변

1

Platform.runLater을 사용해 보셨습니까? Platform.runLater() 호출을 사용하여 주기적으로 UI를 업데이트하는 장기 실행 코드 (Tasks)가 있습니다. JavaFX 응용 프로그램의 주 스레드에서 Runnable을 실행하여 긴 작업과 별도로 실행되도록합니다.

예. (Java8 람다를 사용하여 - 당신은 대신 새로운 Runnable를 구현 전달할 수, 나는 명확성을 위하여이 상황에서 람다를 선호) :

btn.setOnAction(new EventHandler<ActionEvent>() { 
@Override 
    public void handle(ActionEvent event) { 
     // Somewhere in your new Task() 
     Platform.runLater(() -> { 
      // Update UI 
      announcement.setText("test"); 
     }); 
     // bunch of codes below 
    } 
}); 
+0

platform.runlater를 사용하는 경우에도 버튼을 누르면 UI가 멈추고 모든 텍스트가 함께 표시되며 마지막 줄에는 "test"가 표시됩니다. – Keibee

0

그 이유는 이벤트 처리기 그래서, FX 스레드에서 실행하는 것입니다 UI는 완료 될 때까지 업데이트 될 수 없습니다. ItachiUchiha가 이미 제안한 것처럼 코드를 Task 안에 넣어야합니다. TextArea에서 텍스트를 업데이트해야 할 경우 작업 updateMessage() 메서드를 사용하십시오. 작업 메시지 속성에 ChangeListener를 넣고 해당 수신기 내에서 텍스트를 설정합니다.

관련 문제