我正在構建和創建流程的應用程序,並將其輸出流傳輸到javafx文本區域。就像終端仿真器一樣,如果進程顯示的行太多,我希望輸出自動滾動到控制檯的末尾。使用自動滾動將流處理輸出到Java FX文本區
問題是文本區域不滾動到文本的末尾,而是停留在頂部。另一個奇怪的行爲是,當我嘗試使用鼠標滾輪/鍵盤/滾動條滾動文本區域時,文本區域滾動到最頂端。
我已經試過答案here,here和here。看來我在別的地方有什麼問題。
以下是方法void streamToTextArea(java.lang.Process process)
的內容 - 在執行該流程並將其流式傳輸到consoleTextArea
時執行繁重程序的方法。
Task bgTask = new Task<Void>() {
@Override
protected void call() throws Exception {
InputStream inputStream = process.getInputStream();
StringBuilder consoleContent = new StringBuilder();
try (BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))) {
String line;
while((line = reader.readLine()) != null) {
consoleContent
.append(line)
.append("\n");
updateMessage(consoleContent.toString());
consoleTextArea.appendText(""); // trigger ChangeListener
}
} catch (IOException e) { doSomething(e); }
return null;
}
};
StringProperty textProperty = consoleTextArea.textProperty();
textProperty.addListener((observable, oldValue, newValue) -> {
// currently:
consoleTextArea.selectPositionCaret(consoleTextArea.getLength());
consoleTextArea.deselect();
// also tried:
// consoleTextArea.setScrollTop(Double.MAX);
});
textProperty.bind(bgTask.messageProperty());
// start bgTask as daemon thread
// add event handling when bgTask ended
考慮發佈[MCVE] – c0der