首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JavaFX TextField: Swing InputVerifier的替代品?

JavaFX TextField: Swing InputVerifier的替代品?
EN

Stack Overflow用户
提问于 2017-07-10 08:59:58
回答 2查看 634关注 0票数 1

我正在寻找Swing InputVerifier的替代方案,以替代JavaFX TextField。

Swing InputVerifier将阻止进行验证的输入。

考虑以下Swing JTextField代码:

代码语言:javascript
复制
InputVerifier iv = new InputVerifier() {
    /* (non-Javadoc)
     * @see javax.swing.InputVerifier#verify(javax.swing.JComponent)
     */
    @Override
    public boolean verify(JComponent input) {
        JTextField tf = (JTextField) input;
        if (!myRegExTool.matches(tf.getText())) {
            return false;
        }
        return true;
    }
};
jinstance.setInputVerifier(iv);

我可以使用TextField.setOnKeyTyped或侦听器来TextField.textProperty来检查输入的文本。但是,这不会阻止无效文本进入TextField。不过,我可以删除不验证的类型化文本,但这不是一个好的解决方案。

解决方案:是由James_D建议的,带有过滤器的TextFormatter是最好的解决方案

代码语言:javascript
复制
    UnaryOperator<Change> textFilter = change -> {
        String input = change.getText();
        if (!myRegExTool.matches(input)) {
            return null;
        }
        return change;
    };
    instance.setTextFormatter(new TextFormatter<String>(textFilter));
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-07-13 11:48:14

正如D最初建议的那样,一个带有过滤器的TextFormatter是解决方案。

代码语言:javascript
复制
TextField instance = new TextField();
UnaryOperator<Change> textFilter = change -> {
    String input = change.getText();
    if (!change.isContentChange()) {
        return change;
    }
    if (!myRegExTool.matches(input)) {
        return null;
    }
    return change;
};
instance.setTextFormatter(new TextFormatter<String>(textFilter));
票数 1
EN

Stack Overflow用户

发布于 2017-07-10 19:41:01

我有StringConverterUnaryOperatorTextFormatter.的IntegerField控件也许对你有帮助!

代码语言:javascript
复制
import javafx.scene.control.TextField;
import javafx.scene.control.TextFormatter;
import javafx.util.StringConverter;
import javafx.util.converter.IntegerStringConverter;
import java.util.function.UnaryOperator;

public class IntegerField extends TextField {

public IntegerField() {
    super();
    StringConverter<Integer> integerStringConverter = new IntegerStringConverter();
    UnaryOperator<TextFormatter.Change> filter = getFilter();
    setTextFormatter(new TextFormatter<>(integerStringConverter, null, filter));
    setOnAction(event -> integerStringConverter.fromString(this.getText()));
}

private UnaryOperator<TextFormatter.Change> getFilter() {
    return change -> {
        String text = change.getText();
        if (!change.isContentChange()) {
            return change;
        }
        if (text.matches("[0-9]*")) {
            return change;
        }
        return null;
    };
}

public Integer getValue() {
    return Integer.valueOf(this.getText());
}

}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45007773

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档