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

Programmatically unchecking a Checkbox within Vaadin Context Menu

我创建了一个具有树结构的上下文菜单(添加了菜单项,然后在这些菜单项中添加了复选框作为子菜单项)。这在手动 adding/removing 项目方面工作得很好。但是,当涉及到以编程方式重置项目时,在通用组件与特定组件(在本例中为复选框)方面存在冲突。

Component comp = contextMenu.getItems().get(x).getSubMenu().getItems().get(y);
if (comp instanceof Checkbox) {
    ((Checkbox) comp).setValue(false);
}

请注意,comp 实际上不是 Checkbox 的一个实例;相反,它以 com.vaadin.flow.component.contextmenu.MenuItem 的形式返回,并且该项目无法投射到复选框。所以问题是,我如何取消选中给定的复选框?

霍克说的话:

如果您创建了类似于 menuItem.getSubMenu().addItem(new Checkbox("My option")) 的菜单项,那么您可以遍历子组件并取消选择它们:

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) 时会想到两个缺点。首先,可检查项目不能有子菜单。其次,选中项目时菜单将关闭。