【问题标题】:Maintain indentation in RichTextFX CodeArea在 RichTextFX CodeArea 中保持缩进
【发布时间】:2019-01-14 19:17:52
【问题描述】:

我正在 RichTextFX CodeArea(我相信它是 TextArea 的一种)中构建一个 YAML 编辑器。当我按 Enter 时,我想保持当前的缩进级别。比如:

- item1: foo
  item1A:
    subElement: A
<there should be 4 spaces here after I hit enter>

或者,如果有人已经在 RichTextFX 或 JavaFX 中构建了 yaml 编辑器,我希望有一个链接。

当我在此之后按回车时,添加一个子元素 unde

【问题讨论】:

    标签: javafx richtextfx


    【解决方案1】:

    您可以尝试以下方法:

    Pattern whiteSpace = Pattern.compile( "^\\s+" );
    
    codeArea.addEventFilter( KeyEvent.KEY_PRESSED, KE ->
    {
        if ( KE.getCode() == KeyCode.ENTER )
        {
            Matcher m = whiteSpace.matcher( codeArea.getParagraph( codeArea.getCurrentParagraph() ).getSegments().get( 0 ) );
            if ( m.find() ) Platform.runLater( () -> codeArea.insertText( codeArea.getCaretPosition(), m.group() ) );
        }
    });
    

    【讨论】:

      【解决方案2】:

      这是我编写的一个小助手类,如果当前行以给定的后缀结尾,它将保持缩进甚至增加缩进一级。它使用 RichTextFX 的 InputMap-API。

      import java.util.Arrays;
      import java.util.regex.Matcher;
      import java.util.regex.Pattern;
      import org.fxmisc.richtext.GenericStyledArea;
      import org.fxmisc.wellbehaved.event.EventPattern;
      import org.fxmisc.wellbehaved.event.InputMap;
      import org.fxmisc.wellbehaved.event.Nodes;  
      import javafx.scene.input.KeyCode;
      
      public class RichTextFXAutoIndenter {
          
          private static final Pattern LEADING_WHITESPACE = Pattern.compile( "^\\s+" );
      
          public static void install(GenericStyledArea<?, String, ?> genericStyledArea, String ... indentSuffixes) {
              Nodes.addInputMap(genericStyledArea, InputMap.consume(EventPattern.keyPressed(KeyCode.ENTER), event -> enterPressed(genericStyledArea, indentSuffixes)));       
          }
          
          private static void enterPressed(GenericStyledArea<?, String, ?> genericStyledArea, String[] indentSuffixes) {
              genericStyledArea.replaceSelection("\n" + getIndentation(genericStyledArea, indentSuffixes));
          }
          
          private static String getIndentation(GenericStyledArea<?, String, ?> genericStyledArea, String[] indentSuffixes) {
              String currentLine = genericStyledArea.getParagraph(genericStyledArea.getCurrentParagraph()).getSegments().get(0);
              Matcher m = LEADING_WHITESPACE.matcher(currentLine);
              String indent = "";
              if (m.find()) {
                  indent =  m.group();
              }
              if (Arrays.stream(indentSuffixes).anyMatch(suffix -> currentLine.trim().endsWith(suffix))) {
                  indent += "\t";
              }
              return indent;
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-19
        • 1970-01-01
        • 2012-12-08
        • 1970-01-01
        • 1970-01-01
        • 2014-07-22
        相关资源
        最近更新 更多