使用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&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都没有变化),直到重复清理/构建,并且在刷新期间不会在调试器中重新输入方法调用。
我显然做错了什么。