【问题标题】:How to disable textArea auto-scrolling in javaFx java8如何在 javaFx java8 中禁用 textArea 自动滚动
【发布时间】:2016-08-17 15:06:38
【问题描述】:

我有一个程序可以将大量文本打印到我在应用程序中用作控制台的文本区域。

它输出实时的建筑信息。

默认情况下它会向下滚动到底部,这很好,但我希望能够抓住滚动条并在文本区域中向上查看在文本仍附加到文本区域时发生了什么。

我的问题是当我抓住滚动条时如何禁用自动滚动?

理想的情况是: 如果滚动条回到末尾,则自动滚动 当我向上滚动滚动条时禁用自动滚动,因为它很难阅读任何内容,而文本一直跳回末尾。

这是我的文本区域附加程序

private void run(final TextArea console) {
    try {
        console.clear();
        BufferedReader stdInput;
        stdInput = new BufferedReader(new InputStreamReader(process.getInputStream()));

        String line;
        while ((line = stdInput.readLine()) != null) {
            String feed = line;
            Platform.runLater(() -> console.appendText(feed + "\n"));
        }
    } catch (Exception e) {
        console.appendText(e.toString());
    }
}

【问题讨论】:

    标签: java javafx


    【解决方案1】:

    我遇到了同样的问题,这解决了。基本上在文本更新之前/之后获取滚动位置并确保它是相同的:

    Platform.runLater(() -> {
        double pos = console.getScrollTop();
        int anchor = console.getAnchor();
        int caret = console.getCaretPosition();
        console.appendText(feed + '\n');
        console.setScrollTop(pos);
        console.selectRange(anchor, caret);
    });
    

    注意:这是用 .setText() 测试的,而不是用 appendText() 测试的

    编辑:添加选择代码 - 没有它,它将有未定义的行为

    【讨论】:

    • 感谢您的回答,我做过类似的事情,但感觉不对,我在控制台中发生了很多事情,然后这个解决方案会稍微损害性能。我以为我可以在单击锚点时禁用自动滚动并在之后重新启用它,但似乎很难找到/执行此操作
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-15
    • 1970-01-01
    • 2013-07-21
    • 1970-01-01
    • 2013-10-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多