代码之家  ›  专栏  ›  技术社区  ›  Siro Duschletta

删除JavaFx文本区域的第一行

  •  7
  • Siro Duschletta  · 技术社区  · 10 年前

    你好,我想删除JavaFx文本区的第一行。 我在Textarea上设置了一个TextFormatter,当其中超过20行时,我想删除第一行:

    private <T> TextFormatter<T> createTextFormatter() {
    
        final IntegerProperty lines = new SimpleIntegerProperty(1);
    
    
        return new TextFormatter<>(change -> {
            if (change.isAdded()) {
                if (change.getText().indexOf('\n') > -1) {
                    lines.set(lines.get() + 1);
                }
                if (lines.get() > 20) {
                    //TODO
                    //delete first row
                }
            }
            return change;
        });
    }
    

    如果有人能帮忙我会很高兴的

    谢谢

    3 回复  |  直到 10 年前
        1
  •  7
  •   guleryuz    10 年前

    重写TextArea的replaceText方法并检查行数,如果超过20行则删除第一行,

    import javafx.application.Application;
    import javafx.scene.Scene;
    import javafx.scene.control.TextArea;
    import javafx.scene.layout.StackPane;
    import javafx.stage.Stage;
    
    public class FixedLineCountTextAreaTry extends Application {
        public static void main(String[] args) {
            launch(args);
        }
        @Override
        public void start(Stage primaryStage) {
            primaryStage.setTitle("Try to enter me more than 20 lines...");
            TextArea ta = new TextArea() {
                @Override
                public void replaceText(int start, int end, String text) {
                    super.replaceText(start, end, text);
                    while(getText().split("\n", -1).length > 20) {
                        int fle = getText().indexOf("\n");
                        super.replaceText(0, fle+1, "");
                    }
                    positionCaret(getText().length());
                }
            };
    
            StackPane root = new StackPane();
            root.getChildren().add(ta);
            primaryStage.setScene(new Scene(root, 300, 500));
            primaryStage.show();
        }
    }
    
        2
  •  0
  •   Vladlen Gladis    10 年前

    如果u表示新行为,则此代码将正常工作。

            String array[] = textArea.getText().split("\n");
            String textToSet = "";
            for(int i=1; i<array.length; i++){
                textToSet+=array[i] + "\n";
            }
            textArea.setText(textToSet);
    
        3
  •  -1
  •   Christian Bongardt    8 年前

    尝试基于文本格式化程序的此解决方案。

    TextFormatter<String> { change ->
                if (change.isAdded) {
                    val maxByteSize = 1.5e+6 //15 mb
                    if (change.controlNewText.length <= maxByteSize) change
                    else {
                        val textArea = change.control as TextArea
                        val end = if (textArea.length > change.text.length) change.text.length else textArea.length
                        textArea.replaceText(0, end, "")
                        change.setRange(textArea.length, textArea.length)
                        change
                    }
                } else {
                    change
                }
    }