JavaFX - 限制TextArea行?

Tom*_*mmo 11 java textarea javafx limit maxlength

在Swing中,我创建了一个自定义文档,它能够确定并限制TextArea中的行数,无论是换行还是换行.我希望在FX中找到类似的东西,但一直没能.有关如何处理限制允许的行数的任何建议?

编辑:这就是我试图弄清楚TextArea中包含多少行的方式.最大的问题是获得准确的宽度传递到setWrappingWidth,因为TextArea的内容上似乎有一些填充以及边框.

Text helper = new Text();
helper.setText(text);
helper.setFont(getFont());
helper.wrappingWidthProperty().bind(widthBinding);
Font font = getFont();
FontMetrics fontMetrics = Toolkit.getToolkit().getFontLoader().getFontMetrics(font);
int preferredHeight = new Double(helper.getLayoutBounds().getHeight()).intValue();
int lineHeight = new Double(fontMetrics.getMaxAscent() + fontMetrics.getMaxDescent()).intValue();
System.err.println("preferredHeight / lineHeight: " + preferredHeight / lineHeight);
return preferredHeight / lineHeight;
Run Code Online (Sandbox Code Playgroud)

eck*_*kig 7

自Java 8 Update 40以来,每个人TextInputControl都有TextFormatter这个任务.

它有两个功能,其中一个可用于您的任务:

可以拦截和修改用户输入的过滤器(getFilter()).这有助于使文本保持所需的格式.

这是一个非常原始的尝试来解决这个问题:

public class Main extends Application {
    @Override
    public void start(Stage primaryStage) {
        BorderPane root = new BorderPane();

        final TextArea textArea = new TextArea();
        textArea.setTextFormatter(createTextFormatter());
        root.setCenter(textArea);

        primaryStage.setScene(new Scene(root, 400, 400));
        primaryStage.show();
    }

    private static <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() > 10) {
                    change.setText("");
                }
            }
            return change;
        });
    }

    public static void main(String[] args) {
        launch(args);
    }
}
Run Code Online (Sandbox Code Playgroud)

这成功阻止用户输入超过10行.但是你应该改进这个解决方案,例如处理:

  • 文字被取代了
  • 文字已删除

TextFormatter真的很强大,应该能够处理所有这些.