在PrimeFaces列表框中显示动态图像

时间:2013-09-16 00:52:14

标签: jsf jsf-2 primefaces

使用PrimeFaces,我成功生成了动态生成的图像并将其显示在p:graphicImage中,但是selectOneListbox没有显示由相同代码生成的图像。

JSF:

<p:selectOneListbox id="imgListBox" value="#{Bean.selectedimg}" var="img" style="height:600px; width: 400px">
    <f:selectItems value="#{Bean.availableimgs}" var="img" itemLabel="#{img.imgName}" itemValue="#{img}" />

    <p:column>
        <p:graphicImage value="#{img.picture}" alt="#{img.imgFileName}"/>
    </p:column>

    <p:column>
        <p:outputLabel id="imgNameLabel" value="#{img.imgName}"/>
    </p:column>
</p:selectOneListbox>

豆:

private StreamedContent Picture;

public StreamedContent getPicture() throws IOException {
    if (Picture == null) {
        ...
        ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
        ImageIO.write(im, "png", byteStream);
        // ImageIO.write(im, "png", new File(String.format("/home/user/Desktop/IMG/%s.png", imgFile.getName())));
        this.Picture = new DefaultStreamedContent(new ByteArrayInputStream(byteStream.toByteArray()), "image/png");
        return this.Picture;
    }
}

所有这些都是替代文字。将图像转储到注释掉的行中的文件中工作正常。将StreamedContent对象返回到标签中的转储也可以正常工作并显示其字符串表示形式:

org.primefaces.model.DefaultStreamedContent@47afcfac
org.primefaces.model.DefaultStreamedContent@1b43fbba

等等。 Image src标签似乎也与上​​面的工作单个图像类似地填充:

/testJSF/faces/javax.faces.resource/dynamiccontent.properties?ln=primefaces&amp;pfdrid=pfdrid_d905ac48-0fb4-4d2c-8282-9c84a714a92c

但在我访问过的任何浏览器中都没有图像(Epiphany,IE9 32 / 64bit,FF13 Linux,FF21 Win7)

尝试使用这样的列表来工作,我注意到NetBeans总是通过添加import javax.enterprise.context.SessionScoped 为@SessionScoped bean注释“固定导入”并且页面有效(除了图形)。 PrimeFaces演示示例中的bean通过faces-config.xml作为请求作用域注入。如果我使用带有 import javax.faces.bean.RequestScoped; 的@RequestScoped注释,那么与bean无关的任何东西都可以工作。此外,如果我将@SessionScoped注释的导入更改为 javax.faces.bean.SessionScoped ,那么也没有任何工作。任何人都可以解释在支持PrimeFaces JSF和使用什么导入的bean上应该使用哪些注释,因为对于像我这样的菜鸟来说这太混乱了?

最糟糕的是,简单的graphicsImage只能使用@SessionScoped bean导入 javax.enterprise.context.SessionScoped 。如果我刷新了页面,那么图像将会消失(实际的URL会发生变化而且旧的URL都没有变化),直到重复清理/构建,并且在刷新期间不会在调试器中重新输入方法调用。

我显然做错了什么。

0 个答案:

没有答案