2014-10-14 2 views
0

다른 스레드의 텍스트를 업데이트하는 JavaFx TextArea가 있습니다.항상 TextArea의 마지막 줄 표시

/** 
    * Start a new thread to update the text in the textarea. The progressmanager is called in a loop to deleiver the updated text 
    */ 
    private void startTextAreaUpdate() { 

     final Task<Void> updateTextAreaTask = new Task<Void>() { 

      @Override 
      protected Void call() throws Exception { 

       // Start updating the progresstext 
       while (!prog.getIsDone()) { 
        updateMessage(prog.getProgressText()); 
        Thread.sleep(100); 
       } 

       return null; 

      } 

     }; 

     //Here the TextArea text is bound to the task 
     taProgressText.textProperty() 
       .bind(updateTextAreaTask.messageProperty()); 
     // Start the action in a new thread 
     Thread th = new Thread(updateTextAreaTask); 
     th.setDaemon(true); 
     th.start(); 

    } 

텍스트가 텍스트 영역에 맞지 않기 때문에 항상 텍스트의 마지막 줄을 표시하려고합니다. 주 스레드에서 ChangeListener를 추가합니다.

taProgressText.textProperty().addListener(new ChangeListener<String>() { 

    @Override 
    public void changed(ObservableValue<? extends String> observable, 
      String oldValue, String newValue) { 
     int lastPos = taProgressText.getText().length(); 
     taProgressText.positionCaret(lastPos); 
    } 
}); 

그러나 위치는 변경되지 않습니다. 여기서 뭐가 잘못 됐어?

+0

정말 귀하의 질문에 관련되지 있지만 updateMessage 방법의 구현을 표시하지 않습니다 : 대신 바인딩과 현재 청취자가 당신이의 (... 추한 해킹)이보십시오. FX 응용 프로그램 스레드에서 실행해야한다고 생각합니다. – Boomah

+1

@Boomah ['updateMessage'] (http://docs.oracle.com/javase/8/javafx/api/javafx/concurrent/Task.html#updateMessage-java.lang.String-)는 Task API의 일부입니다. , "updateMessage에 대한 호출은 병합되어 나중에 FX 응용 프로그램 스레드에서 실행됩니다." – jewelsea

답변

0

캐럿의 위치가 바뀌었지만 실제로 스크롤하지 않는다고 생각합니다.

updateTextAreaTask.messageProperty().addListener(new ChangeListener<String>() { 
    @Override 
    public void changed(ObservableValue<? extends String> obs, String oldMessage, String newMessage) { 
     taProgressText.setText(newMessage); 
     ScrollBar scrollBar = (ScrollBar) taProgressText.lookup(".scroll-bar:vertical"); 
     if (scrollBar != null) { 
      scrollBar.setValue(scrollBar.getMax()); 
     } 
    } 
}); 
+0

이 기능이 작동하지 않습니다. 다른 스레드에서 TextArea를 업데이트 할 때 버그가 의심됩니다. 나는 또한 setScrollTop (Double.MAX_VALUE)과 setScrollTop (Double.MIN_VALUE)을 시도했다. 내가 listener가 트리거되지만 아무것도 스크롤바와 함께 발생 디버그. – hsc

+0

다른 스레드에서 업데이트되지 않습니다. FX 응용 프로그램 스레드에서 실행됩니다. 그것은 나를 위해 일했으나 이와 같은 조회 작업은 그다지 강력하지 않습니다. –