更新验证器

时间:2014-05-23 14:01:07

标签: javafx javafx-2 javafx-8

我正在使用此代码验证TextField的网络端口。

fieldNport.textProperty().addListener(new ChangeListener<String>()
{
    @Override
    public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue)
    {
        IpAddressNameValidator.hide();
        if (!newValue.matches("-?\\d+(\\.\\d+)?"))
        {
            MenuItem cc = new MenuItem(newValue + " is not correct network port");
            cc.getStyleClass().add("validator-item");
            IpAddressNameValidator.getItems().clear();
            IpAddressNameValidator.getItems().add(cc);
            IpAddressNameValidator.show(fieldNport, Side.RIGHT, 10, 0);
        }
    }
});

我注意到当我用退格键删除旧值时,验证程序没有更新。我找到的唯一解决方案是这个IpAddressNameValidator.hide();然后再次显示验证器消息。

我在添加或删除值时有其他方法刷新验证器消息吗?此解决方案有效,但当我添加新值时,消息会闪烁。

1 个答案:

答案 0 :(得分:1)

每次文本更改且正则表达式匹配时,您都会不必要地重新创建MenuItem等。而是这样做:

fieldNport.textProperty().addListener(new ChangeListener<String>()
{
    private MenuItem cc = new MenuItem();
    {
        cc.getStyleClass().add("validator-item");
        ipAddressNameValidator.getItems().clear();
        ipAddressNameValidator.getItems().add(cc);
    }

    @Override
    public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue)
    {
        if (!newValue.matches("-?\\d+(\\.\\d+)?"))
        {
            if ( ! ipAddressNameValidator.isShowing() )
            {
                ipAddressNameValidator.show(fieldNport, Side.RIGHT, 10, 0);
            }
            cc.setText( newValue + " is not correct network port" );
        }
    }
});