2016-07-29 2 views
0

이 항목에 대한 Stackoverflow의 다른 기사를 읽었습니다. 그러나 그들 중 누구도 내 문제와 정확히 일치하지 않습니다.JavaFX : appendText가 있지만 Listener가없는 TextArea 자동 스크롤

알고리즘을 TextArea에 기록하고 싶습니다. 각 반복 알고리즘에서이 TextArea의 텍스트는 appendText()를 통해 확장되어야합니다.

첫 번째 문제는 새 스레드를 어디에 만들어야하며 두 스레드가 서로 어떻게 통신 할 수 있습니까 (GUI 및 알고리즘)?

실제 디자인에는 세 가지 중요한 클래스가 있습니다 : TextArea와 알고리즘 및 알고리즘을 호출하는 컨트롤러를 보유하고있는 뷰. 반복 횟수와 TextArea (appendText() 호출)가 필요합니다. 방법을 코드에서 severage 장소에 적용).

이 설계에서는 컨트롤러가 알고리즘을 호출하고 알고리즘이 for-loop로 n 번 반복하고 종료 한 후 GUI에 변경 사항이 표시됩니다. 그러나 알고리즘이 appendText() - 메소드를 호출 할 때 GUI가 변경 사항을 동시에 표시하기를 원합니다.

두 번째 문제점은 TextArea의 자동 스크롤입니다. appendText-call을 한 후 TextArea를 완전히 스크롤해야합니다. 하지만이 문제의 해결책은 제 첫 번째 문제와 같은 해결책이라고 생각합니다.

나는 약간 도움을 위해 아주 고맙게 여길 것입니다.

답변

0

많은 정보가 없으면 질문에 완전히 대답 할 수 없지만 알고리즘을 사용하면 알고리즘의 각 단계에서 호출 할 수있는 메시지를 처리하는 것이 일반적입니다. 알고리즘 컨트롤러에서 FX 응용 프로그램 스레드의 메시지로 텍스트 영역을 업데이트하는 콜백 구현을 전달하십시오.

뭔가 같은 :

public class Algorithm { 

    private Consumer<String> statusCallback ; 

    public Algorithm(Consumer<String> statusCallback) { 
     this.statusCallback = statusCallback ; 
    } 

    public Algorithm() { 
     // by default, callback does nothing: 
     this(s -> {}); 
    } 

    public void performAlgorithm() { 

     while (! finished()) { 
      doNextStep(); 
      String statusMessage = getStatus(); 
      statusCallback.accept(statusMessage); 
     } 
    } 
} 

하고 들어 다음

public class Controller { 

    private View view = ... ; 

    public void startAlgorithm() { 
     Algorithm algorithm = new Algorithm(s -> Platform.runLater(view.appendStatus(s))); 
     Thread t = new Thread(algorithm::performAlgorithm); 
     t.setDaemon(true); 
     t.start(); 
    } 
} 

View 당신은 다음 (당신이 textArea.setScrollTop(Double.MAX_VALUE); 아래로 스크롤 할 수 있습니다 주) 수행

public class View { 
    private TextArea textArea ; 

    public View() { 
     textArea = new TextArea(); 
     // ... 
    } 

    public void appendStatus(String status) { 
     if (!textArea.getText().isEmpty()) { 
      textArea.appendText("\n"); 
     } 
     textArea.appendText(status); 
     textArea.setScrollTop(Double.MAX_VALUE); 
    } 
} 

이를 알고리즘이 너무 많은 상태를 생성하지 않는 한 작동해야합니다. 너무 빠르기 때문에 FX 응용 프로그램 스레드가 넘쳐 정상 작동하지 않게됩니다.

관련 문제