SelectItem的丰富工具提示

时间:2010-04-22 10:37:48

标签: jsf richfaces

rich:tooltip内使用f:selectItems属性的变量时,如何将for附加到rich:tooltip生成的列表中。

此代码工作正常(#{prefix}的值为theprefixvalue

<ui:composition>
<a4j:form id="#{prefix}_form">
<h:selectOneRadio style="text-align:left" id="#{prefix}_rating">
<f:selectItems value="#{test.options}"></f:selectItems>
</h:selectOneRadio>&nbsp; 
<rich:toolTip for="theprefixvalue_form\:theprefixvalue_rating\:0">a</rich:toolTip>      
</a4j:form>
</ui:composition>

但是这段代码没有:

<ui:composition>
<h:outputText value="#{prefix}" />
<a4j:form id="#{prefix}_form">
<h:selectOneRadio style="text-align:left" id="#{prefix}_rating">
<f:selectItems value="#{test.options}"></f:selectItems>
</h:selectOneRadio>&nbsp; 
<rich:toolTip for="#{prefix}_form\:#{prefix}_rating\:0">a</rich:toolTip>        
</a4j:form>
</ui:composition>

引发以下异常:

Caused by: java.lang.IllegalArgumentException: theprefixvalue_rating
    at javax.faces.component.UIComponentBase.findComponent(UIComponentBase.java:612)
    at org.ajax4jsf.renderkit.RendererUtils.findComponentFor(RendererUtils.java:1037)
    at org.richfaces.renderkit.html.ToolTipRenderer.getTargetId(ToolTipRenderer.java:234)
    at org.richfaces.renderkit.html.ToolTipRenderer.constructJSVariable(ToolTipRenderer.java:251)
...

TestBean是会话范围的,这是getOptions();

的代码
public List<SelectItem> getOptions(){
    List<SelectItem> options = new ArrayList<SelectItem>();
    options.add(new SelectItem("a","a"));
    options.add(new SelectItem("b","b"));
    options.add(new SelectItem("c","c"));
    return options;

}

有什么想法吗?目标是在鼠标悬停在不同选项上时提供工具提示。提前谢谢。

修改:显然HtmlSelectOneRadio未实施NamingContainer,因此在UIComponentBase第611行失败: (resultHtmlSelectOneRadiolength>0segments[1] = "theprefixvalue_rating"的实例

        if (result != null && (!(result instanceof NamingContainer)) && length > 0) {
            throw new IllegalArgumentException(segments[i]);

我正在尝试使用我自己的NamedHtmlSelectOneRadio扩展HtmlSelectOneRadio并实现NamingContainer,但我仍在猜测如何使用facelets注入它。有什么想法吗?

1 个答案:

答案 0 :(得分:3)

最后我设法解决了这个问题。

我创建了自己的名为NamedHtmlSelectOneRadio的组件,它只是HtmlSelectOneRadio的包装,但实现了NamingContainer。我不知道这是否会通过其余的JSF代码产生进一步的影响,但我的testcase工作正常。无论如何,如果我发现任何奇怪的行为,我会更新这个答案,以及我将在JSF的Mojarra实现中发布关于HtmlSelectOneRadi o未实现NamingContainer的原因。框。

以下是使用facelets创建自己的组件的步骤。

1包裹课程:

import javax.faces.component.NamingContainer; import javax.faces.component.html.HtmlSelectOneRadio;

public class NamedHtmlSelectOneRadio extends HtmlSelectOneRadio implements NamingContainer {

    public NamedHtmlSelectOneRadio(){
        super();
    }

}

2包装Tag类并将上面的类设置为组件类型:

import com.sun.faces.taglib.html_basic.SelectOneRadioTag;

public class NamedHtmlSelectOneRadioTag extends SelectOneRadioTag {

    public NamedHtmlSelectOneRadioTag(){
        super();
    }
    @Override
    public String getComponentType() {
        return "javax.faces.NamedHtmlSelectOneRadio";
    }

}

3将组件添加到faces-config.xml配置中:

<component>
<component-type> com.eyeprevent.util.NamedHtmlSelectOneRadio </component-type>
<component-class> com.eyeprevent.util.NamedHtmlSelectOneRadio </component-class>
</component>

4将标记添加到taglib(我的是functions.taglib.xml)。有关创建自己的taglib here

的更多信息
<tag>
<tag-name>namedSelectOneRadio</tag-name>
<component>
<component-type>com.eyeprevent.util.NamedHtmlSelectOneRadio</component-type>
</component>
</tag>`

5在.xhtml(或.jsf)页面中添加新的taglib,并将h:selectOneRadio替换为您自己的({是fnc:namedSelectOneRadio

xmlns:fnc="http://eyeprevent.com/fnc"
...

<fnc:namedSelectOneRadio id="#{prefix}_rating">
<f:selectItems value="#{test.options}"></f:selectItems>
</fnc:namedSelectOneRadio>
<rich:toolTip for="#{prefix}_form\:#{prefix}_rating:0">a</rich:toolTip>

就是这样!