gpt4 book ai didi

java - 使用自动滚动将处理输出流式传输到 Javafx Textarea

转载 作者:行者123 更新时间:2023-11-30 06:50:42 27 4
gpt4 key购买 nike

我正在构建一个应用程序,该应用程序创建一个进程,并将其标准输出流式传输到 文本区域。就像终端模拟器一样,如果进程显示太多行,我希望输出自动滚动到控制台末尾。

问题是文本区域不会滚动到文本末尾,而是停留在顶部。另一个奇怪的行为是当我尝试使用鼠标滚轮/键盘/滚动条滚动文本区域时,文本区域滚动到最顶部。

我已经尝试过答案 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

最佳答案

首先,Task.call()方法在JavaFX应用程序线程中执行,因此在此方法中更改当前 View 的任何状态是不合适的。您正在错误的线程中将 "" 添加到 consoleTextArea 中。你应该这样做:

Platform.runLater(() -> {
consoleTextArea.appendText("");
});

第二个问题是调用 consoleTextArea.appendText(""); 不会触发您的 ChangeListener(事实上,它不会执行任何操作),因为您绑定(bind)了 consoleTextArea 文本属性到 Task 消息属性 textProperty.bind(bgTask.messageProperty());。在这种情况下,文本区域将仅监听 Task 消息属性中的文本更改。将监听器添加到消息属性:

bgTask.messageProperty().addListener((observable, oldValue, newValue) -> {
// currently:
consoleTextArea.selectPositionCaret(consoleTextArea.getLength());
consoleTextArea.deselect();

// also tried:
// consoleTextArea.setScrollTop(Double.MAX);
});

关于java - 使用自动滚动将处理输出流式传输到 Javafx Textarea,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42848980/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com