2016-06-21 15 views
4

Hallo Ich möchte die erste Zeile eines JavaFx-Textbereiches löschen. richte ich ein TextFormatter auf meinem Textarea, und ich will die erste Zeile löschen, wenn mehr als 20 Zeilen in ihm sind:Löschen der ersten Zeile eines JavaFx-Textbereiches

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 froh wäre, wenn jemand

Dank

Antwort

4

zwingende TextArea- der replaceText Methode und einen Scheck für Zeilenzahl als erste Zeile löschen, wenn es 20 Zeilen exeeds scheint funktioniert,

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

Das funktioniert nicht, wenn Sie Text mit mehreren Zeilen kopieren und in den Textbereich einfügen ... Sie müssen möglicherweise mehr als eine Zeile am Anfang löschen. –

0

helfen könnte Wenn u bedeutet, dass die neue Zeile \ n ist, wird dieser Code gut funktionieren.

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

diese Lösung Versuchen Sie, auf einem Textformatierungsprogramm basiert.

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

Das Snipped ist Kotlin-Syntax: P –

+0

hmm ... aus [API von TextFormatter] (https://docs.oracle.com/javase/9/docs/api/javafx/scene/control/TextFormatter.Change.html): "Beachten Sie, dass Sie den Status des Steuerelements niemals direkt im Formatter-Handler ändern sollten" ... was Sie tun, indem Sie den Text im darunter liegenden textArea ersetzen (oder missliest ich den Kotlin?) – kleopatra

Verwandte Themen