为了账号安全,请及时绑定邮箱和手机立即绑定

org.primefaces.model.menu.DefaultSubMenu 无法转换为

org.primefaces.model.menu.DefaultSubMenu 无法转换为

沧海一幻觉 2023-03-17 14:12:47
我正在尝试从 PrimeFaces 3.5 升级到 PrimeFaces 4.0,这行代码在 3.5 版上很好:private MenuModel modelPrincipal;private Menubar menuBar;menuBar.getChildren().addAll(modelPrincipal.getContents());但是当我升级到 4.0 版时,我必须按如下方式更改它:private org.primefaces.model.menu.DefaultMenuModel modelPrincipal;private Menubar menuBar;menuBar.getChildren().addAll((Collection<? extends UIComponent>) modelPrincipal.getElements());它抛出标题异常,你们知道解决方法吗?我在迁移文档中找不到任何内容https://github.com/primefaces/primefaces/wiki/Migration-Guide我也试过:menuBar.getElements().addAll(modelPrincipal.getElements());但给我同样的例外任何帮助表示赞赏
查看完整描述

1 回答

?
慕容3067478

TA贡献1773条经验 获得超3个赞

班级在


 menuBar.getChildren().addAll((Collection<? extends UIComponent>) modelPrincipal.getElements());

有点合乎逻辑,因为org.primefaces.model.menu.DefaultMenuItem模型中的元素无论如何都不是 UIComponent(您可以通过跟踪源代码直到基类/接口来看到这一点)。即使您没有明确地转换它,它也会因相同的错误而失败,但会在另一个类的另一行上。


做的


menuBar.getElements().addAll(modelPrincipal.getElements());

出于同样的原因而失败。getElements() 如果您检查了中方法中的代码menuBar,您会看到


public List getElements() {

    MenuModel model = getModel();

    if (model != null) {

        return model.getElements();

    }

    else {

        return getChildren();

    }

}

您甚至可以调试它并看到该模型为 null,然后将getChildren()返回 ,实际上以与您第一次尝试相同的调用结束。但...


您还会getModel()在那里看到 ,也许是在暗示在哪里寻找解决方案。menuBar 有一个setModel(...)to,您可以在其中设置您以编程方式创建的模型。所以解决方案是


menuBar.setModel(modelPrincipal);

如果您以编程方式创建 menuBar。


但大多数情况下,它是通过以下方式添加到 xhtml 中的


<p:menu model="#{menuBean.model}" />

一些额外的提示:

  • 搜索“primefaces menu model 4.0 3.5”得到的结果会给你帮助/提示(至少 G00gle 向我展示了)

  • 在 PrimeFaces 7 文档中键入“menumodel”会提示通用菜单组件中的动态菜单部分,具有完整的示例。https://primefaces.github.io/primefaces/7_0/#/components/menu

  • 拥有一个在 java 代码或 xhtml 中完成代码的 IDE,并检查 api 是否会显示方法setModelmodel属性。

但我同意,迁移文档中的更多解释会有所帮助,但当时(至少我从 3.5 迁移到 4 时)论坛等中提到了这一点......所以当时它是“实际的”



查看完整回答
反对 回复 2023-03-17
  • 1 回答
  • 0 关注
  • 77 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信