【问题标题】:ComponentHierarchyIterator alternative in Apache Wicket 9.2 versionApache Wicket 9.2 版本中的 ComponentHierarchyIterator 替代方案
【发布时间】:2021-03-17 17:40:10
【问题描述】:

我在将 Apache Wicket 7.9 迁移到 9.2 版本时卡住了。

在 7.9 版本中,有 visitChildren (link) 方法,它基于 clazz 参数返回 ComponentHierarchyIterator (link)。 ComponentHierarchyIteratorvisitChildren 方法都在 7.9 中被弃用,并在最新版本中被删除。

文档说使用Use {@link org.apache.wicket.util.visit.IVisitor} insteadComponentHierarchyIterator。但是,IVisitor 是一个接口,我无法找到返回所有组件层次结构或满足要求的访问者实现。

有一个 DeepChildFirstVisitor 抽象类,它是我正在尝试使用的 IVisitor 的实现。

我的 7.9 版本代码库是:

       for (Component m : pushMenuContainer.visitChildren(PushMenu.class)) {
            if (!menu.equals(m)) {
                ((PushMenu) m).hide();
            }
        }

迁移后我的 9.2 代码库将类似于

       for (Component m : pushMenuContainer.visitChildren(PushMenu.class, new IVisitorUnknownImplementation())) {
            if (!menu.equals(m)) {
                ((PushMenu) m).hide();
            }
        }

如果在 Apache Wicket 9.2 中作为 ComponentHierarchyIterator 的替代品可用,我需要关于应该使用哪个访问者的指导?

另外,如果没有可用的,那是否意味着我必须实现自己的层次结构访问者?

【问题讨论】:

    标签: java wicket


    【解决方案1】:

    您可以使用 IVisitor 的匿名实现:

    pushMenuContainer.visitChildren(PushMenu.class, new IVisitor<PushMenu, Void>() {
          @Override public void component(PushMenu pushMenu, IVisit<Void> visit) {
              if (!menu.equals(pushMenu)) {
                  pushMenu.hide();
              }
          }
    });
    

    【讨论】:

    • 9.2的定义好像变了,现在需要重写组件方法而不是访问@Override public void component(Object object, IVisit visit) { }
    • 我的错误。修好了!
    • 我们还需要用一个类型定义IVisitor,否则它会有component(Object obj, IVisit&lt;Object&gt; visit)。因此,IVisitor 将类似于new IVisitor&lt;Component, Object&gt;() {
    猜你喜欢
    • 1970-01-01
    • 2015-07-31
    • 1970-01-01
    • 1970-01-01
    • 2020-04-27
    • 2021-06-26
    • 1970-01-01
    • 2018-01-11
    • 1970-01-01
    相关资源
    最近更新 更多