JavaFX 2.2 TextField maxlength

2022-09-02 23:04:01

我正在处理JavaFX 2.2项目,但我在使用控件时遇到问题。我想限制用户能够在每个.但是我找不到属性或类似maxlength的东西。同样的问题也存在于Swing中,并以这种方式解决。JavaFX 2.2如何解决?TextFieldTextField


答案 1

这是对通用文本字段执行工作的更好方法:

public static void addTextLimiter(final TextField tf, final int maxLength) {
    tf.textProperty().addListener(new ChangeListener<String>() {
        @Override
        public void changed(final ObservableValue<? extends String> ov, final String oldValue, final String newValue) {
            if (tf.getText().length() > maxLength) {
                String s = tf.getText().substring(0, maxLength);
                tf.setText(s);
            }
        }
    });
}

完美运行,除了那个撤消错误。


答案 2

在java8u40中,我们得到了一个新的类TextFormatter:它的主要职责之一是在文本输入被委托到内容之前为文本输入的任何更改提供一个钩子。在该钩子中,我们可以接受/重新标记甚至更改建议的更改。

OP自我回答中解决的要求是

  • 规则:将文本长度限制为短于 n 个字符
  • 修改:如果违反规则,保留最后n个字符作为输入文本,并在开始时删除多余的字符

使用文本格式化程序,这可以像这样实现:

// here we adjust the new text 
TextField adjust = new TextField("scrolling: " + len);
UnaryOperator<Change> modifyChange = c -> {
    if (c.isContentChange()) {
        int newLength = c.getControlNewText().length();
        if (newLength > len) {
            // replace the input text with the last len chars
            String tail = c.getControlNewText().substring(newLength - len, newLength);
            c.setText(tail);
            // replace the range to complete text
            // valid coordinates for range is in terms of old text
            int oldLength = c.getControlText().length();
            c.setRange(0, oldLength);
        }
    }
    return c;
};
adjust.setTextFormatter(new TextFormatter(modifyChange));

旁白:

  • 在侦听属性更改的同时修改属性可能会导致意外的副作用
  • 所有关于键级事件的建议解决方案都已损坏(它们无法处理粘贴/程序更改)

推荐