有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java重置小部件的默认值,而不触发Vaadin Flow 14 web app中的valuechange侦听器

我有几个小部件用于控制Grid中项目列表的过滤。每个小部件都有一个值更改侦听器,因此当用户使用其中一个小部件时,会在Grid后面的数据提供程序上配置过滤器,从而导致Grid对象显示其项的子集

    strength = new RadioButtonGroup <>();  // Backed with enum named `Strength`. 
    strength.setLabel( "Strength:" );
    strength.setItems( Strength.values() );
    strength.setValue( Strength.ANY );
    strength.setRenderer( new TextRenderer <>( Strength :: getDisplayName ) );
    strength.addValueChangeListener( event -> {
        configureFilters();
    } );

这很有效

我还有一个重置按钮,可以将过滤器控件恢复到默认状态

    reset = new Button( "Reset" );
    reset.addClickListener( event -> {
        this.resetCriteria();
        this.configureFilters();
    } );

resetCriteria方法进行一系列调用:

this.strength.setValue( Strength.ANY );

这会引起问题。重置这些小部件会触发值更改事件,并执行侦听器。这会中断我的一系列setValue( … )调用。因此,一些过滤器控件小部件不会被重置

➥ 在我将所有小部件值重置为默认值的短暂间歇期间,是否有方法暂停触发值更改事件,或暂停侦听器的侦听

或者我应该采取完全不同的方法来重置小部件?我想我可以放弃小部件的整个布局,从头开始重新创建,但这似乎有些过分,应该有一种更优雅的方法


共 (1) 个答案

  1. # 1 楼答案

    与Vaadin版本8一样,有一种方法可以确定(值更改)事件是来自用户还是“合成”(由代码生成)

    参见方法^{}

    Class ComponentEvent<T extends Component>

    public boolean isFromClient()

    Checks if this event originated from the client side.

    Returns:

    true if the event originated from the client side, false otherwise

    因此,如果给定的事件 isFromClient然后只执行逻辑。将if ( event.isFromClient() )添加到代码中

        strength.addValueChangeListener( event -> {
            if ( event.isFromClient() ) { this.configureFilters(); }
        } );
    

    否则(据我所知)没有办法让听众沉默 除了自己做之外。例如

    • 记住注册每个监听器时的^{},在之前关闭它们,在更改完值后重新添加监听器
    • 建立自己的杀手锏,让听众检查是否必须采取行动