首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >覆盖Primefaces

覆盖Primefaces
EN

Stack Overflow用户
提问于 2017-04-03 19:59:34
回答 1查看 2.3K关注 0票数 2

我正在使用Primefaces和JSF2.2开发一个动态菜单。

问题是它没有插入菜单id。查看primefaces的代码时,它会碰到一个始终为假的代码:

BaseMenuRenderer:

代码语言:javascript
复制
protected boolean shouldRenderId(MenuElement element) {
    if(element instanceof UIComponent)
        return shouldWriteId((UIComponent) element);
    else
        return false;
}

TieredMenuRenderer:

代码语言:javascript
复制
 writer.startElement("li", null);
                    if(shouldRenderId(submenu)) {
                        writer.writeAttribute("id", submenu.getClientId(), null);
                    }

因此,我决定重写primefaces的TieredMenuRenderer,但是我的重写构造函数类被调用,但是重写方法从未被调用。

下面是我如何设置我的facesconfig.xml

代码语言:javascript
复制
<render-kit>
        <renderer>
            <component-family>org.primefaces.component</component-family>
            <renderer-type>org.primefaces.component.TieredMenuRenderer</renderer-type>
            <renderer-class>ui.jsf.TieredMenuRenderer</renderer-class>
        </renderer>
    </render-kit>

我的重写课程:

代码语言:javascript
复制
    public class TieredMenuRenderer extends org.primefaces.component.tieredmenu.TieredMenuRenderer {
  @Override
    protected void encodeElements(FacesContext context, AbstractMenu menu, List<MenuElement> elements) throws IOException {
        System.out.println("----------- TEST --------------");
        super.encodeElements(context, menu, elements);
    }

赛斯奥特从不打印。

有人知道我做错了什么吗?

谢谢!

编辑:

向DefaultMenuItem添加ID:

代码语言:javascript
复制
  DefaultMenuItem item = new DefaultMenuItem();
  item.setId(menuItem.getMenuId());// just return a string value.

添加菜单xhtml后,"menucontroller.model“是我使用DefaultMenuModel的primefaces MenuModel:

在执行以下命令时,迭代呈现器工具包,将返回正确的呈现器类型org.primefaces.component.TieredMenuRenderer

代码语言:javascript
复制
Iterator<String> renderKit = kit.getRendererTypes("org.primefaces.component");

执行以下代码时,返回限定类名ui.jsf.TieredMenuRenderer@64baec0e

代码语言:javascript
复制
Renderer renderer = kit.getRenderer("org.primefaces.component", "org.primefaces.component.TieredMenuRenderer");
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-10 16:28:21

首先,我的渲染器没有覆盖正确的渲染器。当我应该重写org.primefaces.component.tieredmenu.TieredMenuRenderer时,我正在重写org.primefaces.component.MenubarRenderer

然后,为了纠正primefaces id问题,我在呈现的类中执行了以下操作:

代码语言:javascript
复制
 @Override
    protected boolean shouldRenderId(MenuElement element) {
        return true;
    }

@Override
    public void encodeEnd(FacesContext context, UIComponent component) throws IOException {
        AbstractMenu menu = (AbstractMenu) component;
        encodeMarkup(context, menu);
        encodeScript(context, menu);
    }

EncodedEnd从覆盖我的ids的素数面调用"generateIds()“。

完整呈现类:

代码语言:javascript
复制
import java.io.IOException;

import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;

import org.primefaces.component.menu.AbstractMenu;
import org.primefaces.model.menu.MenuElement;

public class MenuRenderer extends org.primefaces.component.menubar.MenubarRenderer {

    @Override
    protected boolean shouldRenderId(MenuElement element) {
        return true;
    }

    @Override
    public void encodeEnd(FacesContext context, UIComponent component) throws IOException {
        AbstractMenu menu = (AbstractMenu) component;
        encodeMarkup(context, menu);
        encodeScript(context, menu);
    }

}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43193255

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档