JavaFX TextField:Swing InputVerifier的替代方案?

时间:2017-07-10 08:59:59

标签: javafx javafx-8

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

Swing InputVerifier将阻止确认的输入。

考虑以下Swing JTextField代码:

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是完美的解决方案

    UnaryOperator<Change> textFilter = change -> {
        String input = change.getText();
        if (!myRegExTool.matches(input)) {
            return null;
        }
        return change;
    };
    instance.setTextFormatter(new TextFormatter<String>(textFilter));

2 个答案:

答案 0 :(得分:1)

我的 IntegerField 控制与 StringConverter UnaryOperator < / strong>和 TextFormatter 。也许对你有帮助!

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 :(得分:0)

正如James_D首先提出的那样,带有过滤器的TextFormatter是解决方案。

io.on('connection', function(socket) {
        console.log('a user connected');
        socket.on('hi', function(data) {
            console.log('Hello WOrld');
        });
        socket.on('disconnect', function() {
            console.log('user disconnected');
        });
    });