2016-04-16 2 views
0

Я ищу простое решение для создания первой и последней строки TextArea uneditable. enter image description hereJavafx TextArea uneditable lines

Как видно на картинке, мне нужно сохранить первую и последнюю строку, пользователь может редактировать или вводить все, что захочет, в фигурные скобки. У меня на самом деле появился этот простой класс, но он немного ломается, когда пользователю удается получить закрывающий фигурный скобок на второй строке, не оставляя никаких строк между первым и последним, что позволяет пользователю ничего не редактировать.

Спасибо за все отзывы.

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' может быть полезным. Проверьте это [http://stackoverflow.com/questions/29974765/creating-a-large-body-of-text-with-different-styles-javafx-fxml](http://stackoverflow.com/questions/29974765/ create-a-large-body-of-text-with-different-styles-javafx-fxml) – jns

ответ

1

Используйте TextFormatter с фильтром, который наложил вето на любые изменения, которые не оставляют текст в правильной форме:

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

Выглядит потрясающе, пытаясь его реализовать. Строка «старт» не всегда одинакова, медведь со мной на мгновение :) – Poody

+0

Хорошо, отлично выглядит. Большое спасибо :) – Poody

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