Checkbox 以编程方式取消选中Vaadin上下文菜单中的复选框

Checkbox 以编程方式取消选中Vaadin上下文菜单中的复选框,checkbox,vaadin,contextmenu,vaadin-flow,Checkbox,Vaadin,Contextmenu,Vaadin Flow,我创建了一个树状结构的上下文菜单(添加菜单项,然后在这些菜单项中添加复选框作为子菜单项)。这在手动添加/删除项目方面效果很好。但是,当以编程方式重置项时,常规组件与特定组件(在本例中为复选框)之间存在冲突 注意comp不是Checkbox的一个实例;而是返回com.vaadin.flow.component.contextmenu.MenuItem,并且该项不能转换为复选框。所以问题是,我如何取消选中给定的复选框?霍克说: 如果您创建了类似于menuItem.getSubMenu().addIt

我创建了一个树状结构的上下文菜单(添加菜单项,然后在这些菜单项中添加复选框作为子菜单项)。这在手动添加/删除项目方面效果很好。但是,当以编程方式重置项时,常规组件与特定组件(在本例中为复选框)之间存在冲突

注意comp不是Checkbox的一个实例;而是返回com.vaadin.flow.component.contextmenu.MenuItem,并且该项不能转换为复选框。所以问题是,我如何取消选中给定的复选框?

霍克说:

如果您创建了类似于
menuItem.getSubMenu().addItem(新建复选框(“我的选项”))
的菜单项,则可以迭代子组件并取消选择它们:

menuItem.getSubMenu().getItems().forEach(subMenuItem -> {
  subMenuItem.getChildren()
      .filter(Checkbox.class::isInstance)
      .map(Checkbox.class::cast)
      .forEach(c -> c.setValue(false));
});
但另一种方法是使用
setCheckable(true)
使项目可选。然后您将取消选择它们,如下所示:

menuItem.getSubMenu().getItems().forEach(subMenuItem -> subMenuItem.setChecked(false));

使用
setCheckable(true)
时会想到两个缺点。首先,可检查项不能有子菜单。其次,选中某个项目时,菜单将关闭。

您是否尝试过
comp.getChildren()
查看它们是否直接包含复选框?您知道菜单项本身可以被选中吗?您可以使用
setCheckable
-在这种情况下,您不需要找到复选框,您可以调用
comp.setChecked(false)
@Hawk getChildren()确实是这里的关键方法-谢谢!
menuItem.getSubMenu().getItems().forEach(subMenuItem -> subMenuItem.setChecked(false));