使用 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
等等。图像 src 标记的填充似乎也与上面的工作单图像类似:
/testJSF/faces/javax.faces.resource/dynamiccontent.properties?ln=primefaces&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 作为请求范围注入。如果我将 @RequestScoped 注释与import javax.faces.bean.RequestScoped; 那么与 bean 相关的任何事情都不会起作用。此外,如果我将 @SessionScoped 注释的导入更改为javax.faces.bean.SessionScoped ,那么也不会起作用。谁能解释应该在支持 PrimeFaces JSF 的 bean 上使用哪些注释以及使用哪些导入,因为这对于像我这样的菜鸟来说太混乱了?
最糟糕的是,简单的 graphicsImage 仅适用于 @SessionScoped bean 导入javax.enterprise.context.SessionScoped一次。如果我刷新页面,那么图像将会消失(实际的 URL 会改变,旧的 URL 不会有任何东西),直到重复清理/构建,并且在刷新期间不会在调试器中重新输入方法调用。
我显然做错了什么。