JavaFX - 限制 TextArea 行?

标签 java javafx textarea 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;

最佳答案

每个 TextInputControl 都有一个 TextFormatter自 Java 8 Update 40 起用于此任务。

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

A filter (getFilter()) that can intercept and modify user input. This helps to keep the text in the desired format.

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

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);
    }
}

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

  • 文本已被替换
  • 文字已删除

TextFormatter 非常强大,应该能够处理所有这些。

关于JavaFX - 限制 TextArea 行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31193279/

相关文章:

java - java无法解析textArea

javascript - 将 html 标签添加到文本区域中选定的文本。为什么 "if(' SelectionStart' in textarea)"需要在那里?

java - Vaadin 中必填文本字段中的只读属性会删除星号 (*)

java - 关于 Java 中的 RandomAccessFile 的问题?

JavaFX - 在高 dpi 的 Canvas 上使用矩形绘制时避免模糊

java - 在 JavaFX 中将反射应用于 DropShadow 效果

JavaFX:同时处理组合键和鼠标事件

java - 如何在 Java EE 环境中管理数据库和文件系统的事务?

java - 这个算法是O(n^2)吗?

javascript - 展开/折叠文本区域问题