将文本附加到文本区域,但将插入符号位置设置为行尾

Posted

技术标签:

【中文标题】将文本附加到文本区域,但将插入符号位置设置为行尾【英文标题】:Append text to text area but set caret position to end of line 【发布时间】:2020-01-18 06:27:04 【问题描述】:

嗨!

我目前正在尝试使用 JavaFX 构建终端仿真器,我想在按下“enter”后附加一些文本。 到目前为止这有效,但问题是,在我的文本被附加后,插入符号位置设置为下一行。

这是我目前所拥有的:

   String newLine = System.getProperty("line.separator");
   emulator.appendText(newLine);
   emulator.appendText(prefix);
   emulator.positionCaret(emulator.getLength());

我已经尝试移动 emulator.appendText(newLine) 或完全删除它,但它仍然将插入符号放入下一行。

我该如何继续让它停止这样做?

任何帮助将不胜感激。

【问题讨论】:

按下回车后你想留在当前行的末尾吗?我猜对了吗? 【参考方案1】:

我找到了解决问题的办法。

我没有想到通常由回车键执行的事件。

我所要做的就是在文本区域中添加一个 EventFilter。

emulator.addEventFilter(KeyEvent.KEY_PRESSED, new EventHandler<KeyEvent>() 
            @Override
            public void handle(KeyEvent ke) 
                if (ke.getCode().equals(KeyCode.ENTER)) 

                    //Get Command
                    //Count Rows
                    int rowCount = emulator.getText().split("\n").length;
                    System.out.println(rowCount);

                    String newLine = System.getProperty("line.separator");
                    emulator.appendText(newLine);
                    emulator.appendText(prefix);
                    emulator.positionCaret(emulator.getLength());

                    ke.consume();
                
            
        );

这对我有用。

【讨论】:

是的,这是最合适的做法。但是,有两个注意事项:1)KeyCode.ENTER 是一个常数,因此您可以检查ke.getCode() == KeyCode.ENTER 而不是ke.getCode().equals(KeyCode.ENTER)。 2) 用 switch-case 替换 if 循环在运行时方面非常高效,尤其是当您的事件过滤器中有很多键需要管理时。 你不需要照顾回车;在TextArea 的源代码中没有一次出现\r。此外,您不需要通过拆分文本来自己计算行数。事实上这是次优的:只需使用 emulator.getParagraphs().size() 而不是 emulator.getText().split("\n").length 请注意,您可以使用System#lineSeparator(),而不是直接查询系统属性。

以上是关于将文本附加到文本区域,但将插入符号位置设置为行尾的主要内容,如果未能解决你的问题,请参考以下文章

文本区域 (JTextArea) 的自动文本滚动,插入符号位置设置为最后一行的开头

在文本区域中的光标位置之后插入文本

使用 JavaScript 将 ajax 的结果附加到文本区域

将光标设置到文本区域中特定行上的特定位置

您如何以编程方式将 Flex TextArea 的插入符号移到末尾?

如何将此内容输出到文本区域?