将文本附加到文本区域,但将插入符号位置设置为行尾
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 的结果附加到文本区域