JavaFX 2.2 TextField maxlength

Geo*_*lou 12 java javafx maxlength textfield javafx-2

我正在使用JavaFX 2.2项目,我使用TextField控件时遇到问题.我想限制用户将输入到每个TextField的字符,但我找不到像maxlength这样的属性.摆动存在同样的问题,并以这种方式解决.如何解决JavaFX 2.2?

cek*_*ock 16

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

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);
            }
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

除了那个Undo bug之外,它完美地运行.

  • 注意:在通知期间修改发件人的状态通常是一个坏主意 - 你可能会遇到难以跟踪的副作用(撤消错误可能是一个不必要的副作用,虽然我没有深入研究) (4认同)

kle*_*tra 12

使用java8u40,我们得到了一个新类TextFormatter:它的主要职责之一是在文本输入被调用到内容之前提供一个钩子.在那个钩子里,我们可以接受/拒绝甚至改变建议的改变.

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

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

使用TextFormatter,可以实现如下:

// 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));
Run Code Online (Sandbox Code Playgroud)

旁白:

  • 在听取其变化的同时修改属性可能会导致意外的副作用
  • 密钥级事件的所有建议解决方案都被破坏(它们无法处理粘贴/编程更改


Ser*_*nev 8

您可以执行与此处描述的方法类似的操作:http://fxexperience.com/2012/02/restricting-input-on-a-textfield/

class LimitedTextField extends TextField {

    private final int limit;

    public LimitedTextField(int limit) {
        this.limit = limit;
    }

    @Override
    public void replaceText(int start, int end, String text) {
        super.replaceText(start, end, text);
        verify();
    }

    @Override
    public void replaceSelection(String text) {
        super.replaceSelection(text);
        verify();
    }

    private void verify() {
        if (getText().length() > limit) {
            setText(getText().substring(0, limit));
        }

    }
};
Run Code Online (Sandbox Code Playgroud)