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 楼答案
与Vaadin版本8一样,有一种方法可以确定(值更改)事件是来自用户还是“合成”(由代码生成)
参见方法^{}
因此,如果给定的事件
isFromClient
然后只执行逻辑。将if ( event.isFromClient() )
添加到代码中否则(据我所知)没有办法让听众沉默 除了自己做之外。例如