当前位置: 首页 > 知识库问答 >
问题:

Autoscroll JavaFX文本流

范弘亮
2023-03-14

我有一个JavaFXTextFlow包装在ScrollPane中,并且每当新的Text被添加到TextFlow

我已尝试将侦听器最大化滚动窗格的值附加到:

  • 滚动窗格v值属性本身。
    • 这会将滚动窗格锁定在底部,这是不需要的
    • 这就是行不通。
    • 奇怪的是,这会滚动到添加最新文本之前的底部位置。我尝试在滚动之前显式请求布局,但没有效果

    为了表示特别感谢,我想滚动一下,如果新添加的内容太大,无法立即显示,则滚动窗格会滚动,新添加的内容位于顶部,用户应该手动滚动以查看“溢出”。正如我所说,这将是一个额外的好处,只需滚动到底部就可以了,因为我不希望(经常)有这么大的增加。

    不,我没有切换到文本区域,在这里这将相对简单。我希望能够轻松地将常规、粗体和斜体文本添加到文本流中,而文本区域不支持这一点。我也试过Thomas Mikula的RichTextFX,但是

    1. 它不断地在内部代码上抛出堆栈溢出错误(StackOverflowerError),没有解释

    因此,任何能够与TextFlow一起工作的解决方案都将受到极大的欢迎。

    编辑:解决方案,根据要求:

    private ScrollPane textContainer;
    private TextFlow text;
    
    public BaseGui() {
        //....
        text.getChildren().addListener(
                    (ListChangeListener<Node>) ((change) -> {
                        text.layout();
                        textContainer.layout();
                        textContainer.setVvalue(1.0f);
                    }));
        textContainer.setContent(text);
        //....
    }
    
    public void appendBold(String msg) { //similar for italic and regular
        append(msg, "-fx-font-weight: bold");
    }
    
    private synchronized void append(String msg, String style) {
        Platform.runLater(() -> {
            Text t = new Text(msg);
            t.setFont(segoe(13));
            if (!style.equals("")) {
                t.setStyle(style);
            }
            text.getChildren().add(t);
        });
    }
    

    它不会因为代码风格而赢得任何奖项,但由于这是一个个人项目,我并不在乎。


共有1个答案

闾丘京
2023-03-14

修改第三种方法,使用layout()而不是requestLayout()

requestLayout()将布局标记为脏布局,并导致在下一个脉冲上重新布局。在代码中

requestLayout();
doSomethingThatDependsOnLayout();

doSomethingThatDependsOnLayout()将看到旧的布局。

layout()立即(同步)执行布局,但仅当布局脏时。(在您的情况下,更改TextFlow的文本会将其布局标记为脏的。)在代码中

layout();
doSomethingThatDependsOnLayout();

doSomethingThatDependsOnLayout()将看到新的布局。

 类似资料:
  • 我之前已经用文本编辑器修改过文本。现在,我们要深入理解所谓的“文本”。 文本流 在计算机中,所谓的数据就是0或1的二进制序列,但严格来说,Unix以字节(byte)来作为数据的单位,也就是说这个序列每八位(bit)为一个单位。八位的二进制数字,会落在十进制从0到255的范围内。利用ASCII编码,可以把这一个字节转换成为256个字符中的一个。所以,在Unix中,数据完全可以用字符的形式表示出来,也

  • 字间距 全角中文字符与半角英文字符之间,应有一个半角空格。 错误:本文介绍如何快速启动Windows系统。 正确:本文介绍如何快速启动 Windows 系统。 全角中文字符与半角阿拉伯数字之间,有没有半角空格都可,但必须保证风格统一,不能两种风格混杂。 正确:2011年5月15日,我订购了5台笔记本电脑与10台平板电脑。 正确:2011 年 5 月 15 日,我订购了 5 台笔记本电脑与 10 台

  • Sketch 使用操作系统原生的字体渲染,因此文本看起来都会很棒。使用原生字体渲染的好处就是当你进行网页设计时,你可以肯定作品中的文本都是精准的。Sketch 同时支持文本样式,所以你可以让多个文本图层使用共同的字体,大小,和字间距等等。 添加文本 你可以从工具栏中选择文本工具。当光标变成文本光标时,在画布中任一点单击以添加文本图层。你会看见新的文本图层已被选定,直接开始打字吧。 你也可以单击并拖

  • 文本 See the Pen FEND_Fonts by Li Xinyang (@li-xinyang) on CodePen. 字体 改变字号 font-size: <absolute-size> | <relative-size> | <length> | <percentage> | inherit <absolute-size> 有 small large medium <relativ

  • 原文:Basic text commands text 在Axes的任意位置添加文本。 命令式:matplotlib.pyplot.text,面向对象:matplotlib.axes.Axes.text。 xlabel 向 x 轴添加轴标签。 命令式:matplotlib.pyplot.xlabel,面向对象:matplotlib.axes.Axes.set_xlabel。 ylabel 向 y

  • 问题内容: 我正在从Google文档中提取数据,进行处理,然后将其写入文件(最终我将其粘贴到Wordpress页面中)。 它具有一些非ASCII符号。如何将这些安全地转换为可以在HTML源代码中使用的符号? 目前,我正在将所有内容都转换为,将它们全部合并为Python字符串,然后执行以下操作: 最后一行存在编码错误: 编解码器无法解码位置12286的字节:序数不在范围内(128) 部分解决方案:

  • 在数据存储或传输中,我们经常用到一些纯文本格式的数据或数据文件,例如 CSV、XML、JSON 格式的数据或文件。这些数据可以是存储在文件中,也可以是服务端接口提供(还有一种可能是服务端动态生成对应的数据文件)。 在 JS 中,我们可以通过发送请求的形式加载数据文件或数据接口,并按照一定的格式解析处理成 JS 对象并最终创建图表。 下面用示例来说明在 JS 中如何处理 CSV、XML、JSON 数

  • 问题内容: 是否有任何库(最好在python中,但至少是开放源代码)可以汇总和/或简化自然语言文本? 问题答案: 我不确定当前是否有任何库可以执行此操作,因为文本摘要或至少 可理解的 文本摘要不是通过简单的即插即用库就可以轻松实现的。 这是我设法找到的与文本摘要相关的项目/资源的一些链接,可帮助您入门: 狐猴项目 Python自然语言工具包 O’Reilly的Python自然语言处理书 Googl