2016-06-21 4 views
4

Здравствуйте, я хочу удалить первую строку текстовой области JavaFx. я поставил TextFormatter на моем TEXTAREA и я хочу, чтобы удалить первую строку, когда более 20 строк в нем:Удалить первую строку JavaFx Textarea

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; 
    }); 
} 

II был бы рад, если кто-то может помочь

Благодарности

ответ

4

переопределения метода ReplaceText TEXTAREA в и чек на число строк, чем удалить первую строку, если она exeeds 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(); 
    } 
} 
+0

Это не работает, если вы копируете текст с несколькими строками и вставляете его в текстовую область ... вам может потребоваться удалить более одной строки в начале. –

0

Если u означает, что новая строка \ n, этот код будет работать нормально.

 String array[] = textArea.getText().split("\n"); 
     String textToSet = ""; 
     for(int i=1; i<array.length; i++){ 
      textToSet+=array[i] + "\n"; 
     } 
     textArea.setText(textToSet); 
-1

Попробуйте это решение, основанное на форматировании.

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 
      } 
} 
+0

Сокращенный синтаксис Kotlin: P –

+0

hmm ... из [api doc of textFormatter] (https://docs.oracle.com/javase/9/docs/api/javafx/scene/control/TextFormatter.Change.html): «Обратите внимание, что вы никогда не должны изменять состояние элемента управления непосредственно из обработчика форматирования» ... что вы делаете, заменяя текст в основной текстовой области (или я неправильно читаю kotlin?) – kleopatra

Смежные вопросы