Javafx TextArea lignes non modifiables


Je cherche une solution simple pour rendre la première et la dernière ligne de TextArea non modifiable. entrez la description de l'image ici

Comme on le voit sur l'image, j'ai besoin de garder la première et la dernière ligne, l'utilisateur peut éditer ou entrer ce qu'il veut dans les accolades. J'ai en fait trouvé cette classe simple, mais elle se casse un peu lorsque l'utilisateur parvient à obtenir le accolade fermant sur la deuxième ligne, ne laissant aucune ligne entre la première et la dernière, rendant l'utilisateur incapable de modifier quoi.

Merci pour toutes les réponses.

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);
            }
        }
    }
Author: Poody, 2016-04-16

1 answers

Utiliser un TextFormatter avec un filtre qui bloque toutes les modifications qui ne quittent pas le texte dans la forme correcte:

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);
    }
}
 1
Author: James_D, 2016-04-16 20:04:48