Java 如何将4个连续空格视为单个字符?

Java 如何将4个连续空格视为单个字符?,java,javafx,textarea,whitespace,Java,Javafx,Textarea,Whitespace,我已经编写了一个文本区域,每当我按下某个组合键(在我的例子中是Alt+C)时,它会键入4个连续空格,但是,我正在寻找一种方法,使程序将它们视为单个字符,我的意思是: 如果插入符号向其移动,则插入符号的位置会从空间序列的一端跳到另一端 我只能一次选择所有选项 如果我按backspace键,插入符号在它们前面,那么所有4个都会立即被删除 通过创建插入符号位置侦听器,我成功地完成了前两项任务,但每当我尝试删除4个空格时,就会出现一个indexootfboundsexception错误,将我重定向到

我已经编写了一个文本区域,每当我按下某个组合键(在我的例子中是Alt+C)时,它会键入4个连续空格,但是,我正在寻找一种方法,使程序将它们视为单个字符,我的意思是:

  • 如果插入符号向其移动,则插入符号的位置会从空间序列的一端跳到另一端
  • 我只能一次选择所有选项
  • 如果我按backspace键,插入符号在它们前面,那么所有4个都会立即被删除
通过创建插入符号位置侦听器,我成功地完成了前两项任务,但每当我尝试删除4个空格时,就会出现一个
indexootfboundsexception
错误,将我重定向到侦听器,即使该错误的代码写入一个键事件处理程序,该处理程序会检查按下的键是否为退格

我只想包括与问题相关的代码片段,因为整个程序相当长:

textarea.caretPositionProperty().addListener((ob, old1, new1) -> {
            int oldi = old1.intValue();
            int newi = new1.intValue();
            if(oldi > newi && oldi > 3 && textarea.getText(oldi - 4, oldi).equals("    "))
                textarea.positionCaret(oldi - 4);
            if(oldi < newi && oldi < (textarea.getText().length() - 3) && textarea.getText(oldi, oldi + 4).equals("    "))
                textarea.positionCaret(oldi + 4);
        });


textarea.addEventFilter(KeyEvent.KEY_PRESSED, new EventHandler<KeyEvent>() {
               @Override
               public void handle(KeyEvent e) {
                  int cp = textarea.getCaretPosition();
                   if(e.isAltDown() && (e.getCode() == KeyCode.C)) {
                  //some other code
                  textarea.positionCaret(cp + 4);
                   }
                   if(e.getCode() == KeyCode.BACK_SPACE && areat.length()>3) {
                       if(areat.substring(cp-4, cp).equals("    "))
                       textarea.setText(areat.substring(0, cp-4) + areat.substring(cp));
                   }
               }
            }
        );
我应该如何从这里开始?事件处理程序或插入符号侦听器是否有问题?或者可能有一种特定的方法具有上述所有内置功能

旁注:我不希望切换到
JTextArea
,因为我以前从未使用过swing元素

编辑:如果您是管理员,请不要将此问题标记为已解决,因为我仍在寻找更好的答案,但我已通过将文本属性侦听器的新的文本存储在全局变量(
areatn
)中而不是旧的来解决此问题,我在事件处理程序和插入符号侦听器中都使用了它。如果你找到了一个比我的解决方案更简单的解决方案,请一定要告诉我


编辑2:正如@kleopatra在评论中指出的,TextFormatter类比我的侦听器更适合这种情况。

我不知道它是否有用:使用制表符和制表符大小为4。@OleV.V。要是…就好了不幸的是,据我所知,JavaFX没有提供一种控制制表符间距的方法。@Slaw它正在进行中:。。或许不是:重读之后,我不得不承认我不太理解这个问题;)请提供一份报告,说明您所追求的是什么,以及为什么/如何表现出不符合您希望的行为。。。所有这些都说明了:TextFormatter是您想要使用的(与该区域的任何属性的侦听器相比)-它在应用输入之前获得对输入的所有挂起的更改,并且这些更改可以在每个细节(如文本、选择、插入符号位置)进行修改。我不知道它是否有用:使用制表符,制表符大小为4。@OleV.V。要是…就好了不幸的是,据我所知,JavaFX没有提供一种控制制表符间距的方法。@Slaw它正在进行中:。。或许不是:重读之后,我不得不承认我不太理解这个问题;)请提供一份报告,说明您所追求的是什么,以及为什么/如何表现出不符合您希望的行为。。。所有这些都说明:TextFormatter是您想要使用的(与任何区域属性的侦听器相比)-它在应用输入之前获得输入的每个挂起的更改,并且可以在每个细节(如文本、选择、插入符号位置)中修改该更改
textarea.textProperty().addListener((obs, old1, new1) -> {
            areat = old1;
            areatn = new1;
            //some other code
        });