【问题标题】: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) 或完全删除它,但它仍然将插入符号放入下一行。

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

任何帮助将不胜感激。

【问题讨论】:

  • 按下回车后你想留在当前行的末尾吗?我猜对了吗?

标签: java javafx text textarea area


【解决方案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(),而不是直接查询系统属性。
猜你喜欢
  • 1970-01-01
  • 2022-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-26
  • 2011-01-08
  • 2011-02-22
相关资源
最近更新 更多