2016-04-16 4 views
0

Ich bin auf der Suche nach einer einfachen Lösung, um die erste und letzte Zeile von TextArea nicht editierbar zu machen. enter image description hereJavafx TextArea nicht editierbare Zeilen

Wie auf dem Bild zu sehen, muss ich die erste und letzte Zeile, Benutzer kann bearbeiten oder eingeben, was er will in den geschweiften Klammern. Ich bin tatsächlich mit dieser einfachen Klasse gekommen, aber es bricht irgendwie, wenn der Benutzer es schafft, die schließende geschweifte Klammer in der zweiten Zeile zu bekommen, wobei zwischen dem ersten und dem letzten keine Zeilen übrig bleiben, wodurch der Benutzer nichts bearbeiten kann.

Vielen Dank für alle Antworten.

public static class ScriptArea extends TextArea { 
     @Override 
     public void replaceText(int start, int end, String text) { 
      String currentToStart = getText().substring(0, start); 
      String startToEnd = getText().substring(start); 
      if (currentToStart.contains("\n") && startToEnd.contains("\n")) { 
       super.replaceText(start, end, text.equals("\n")?"\n\t":text); 
      } 
     } 
    } 
+0

'TextFlow' sehr nützlich sein könnte. Überprüfen Sie dies [http://stackoverflow.com/questions/29974765/creating-a-large-body-of-text-with-different-styles-javafx-fxml](http://stackoverflow.com/questions/29974765/ creating-a-large-body-of-text-mit-verschiedenen-styles-javafx-fxml – jns

Antwort

1

ein TextFormatter mit einem Filter verwenden, die alle Änderungen Vetos, die den Text in der richtigen Form nicht verlassen:

import javafx.application.Application; 
import javafx.scene.Scene; 
import javafx.scene.control.TextArea; 
import javafx.scene.control.TextFormatter; 
import javafx.scene.control.TextFormatter.Change; 
import javafx.stage.Stage; 

public class TextAreaFixedStartEndLines extends Application { 

    private final String start = "function collideWith(mobj, tar, dir) {\n"; 
    private final String end = "\n}"; 

    @Override 
    public void start(Stage primaryStage) { 
     TextArea textArea = new TextArea(); 
     textArea.setTextFormatter(new TextFormatter<String>((Change c) -> { 
      String proposed = c.getControlNewText(); 
      if (proposed.startsWith(start) && proposed.endsWith(end)) { 
       return c; 
      } else { 
       return null ; 
      } 
     })); 

     textArea.setText(start+"\n"+end); 

     primaryStage.setScene(new Scene(textArea, 600, 600)); 
     primaryStage.show(); 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 
+0

Sieht fantastisch aus und versucht es zu implementieren. Die "Start" -Linie ist nicht immer die gleiche, trage mich einen Moment :) – Poody

+0

Okay, sieht gut aus. Danke vielmals :) – Poody