PRIMEFACES - 如何通过单击<p:commandButton>刷新<p:graphicImage>?

7
我考虑了这个展示: http://www.primefaces.org/showcase/ui/dynamicImage.jsf ,特别是子案例“on-the-fly的GraphicText”。
我的问题是在这个子案例的扩展版本中添加一个按钮。当按钮被按下时,我需要图像动态更改。
在DynamicImageController类中,我重写了与graphicImage相关联的getter方法:
public StreamedContent getGraphicText(){
     double random = Math.random();// a double value with a positive sign, greater than or equal to 0.0 and less than 1.0.
     if(random>0.5){
         BufferedImage bufferedImg = new BufferedImage(100, 25, BufferedImage.TYPE_INT_RGB);  
         Graphics2D g2 = bufferedImg.createGraphics();  
         g2.drawString("This is a text", 0, 10);  
         ByteArrayOutputStream os = new ByteArrayOutputStream();  
         try {
            ImageIO.write(bufferedImg, "png", os);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }  
         graphicText = new DefaultStreamedContent(new ByteArrayInputStream(os.toByteArray()), "image/png");
     } else {
         BufferedImage bufferedImg = new BufferedImage(100, 25, BufferedImage.TYPE_INT_RGB);  
         Graphics2D g2 = bufferedImg.createGraphics();  
         g2.drawString("This is another text", 0, 10);  
         ByteArrayOutputStream os = new ByteArrayOutputStream();  
         try {
            ImageIO.write(bufferedImg, "png", os);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }  
         graphicText = new DefaultStreamedContent(new ByteArrayInputStream(os.toByteArray()), "image/png");
     }
     return graphicText;
 }

我有一个按钮:
<p:commandButton id="refreshImageButton" value="Refresh image random">
                <p:ajax update=":idForm" />
             </p:commandButton>

以及图片:

<p:graphicImage value="#{dynamicImageController.graphicText}" />

idForm是包含我的graphicImage和commandButton的表单的表单id

我的问题是:

为什么如果我按键盘上的F5按钮,图像会随机更改并与getGraphicText方法中所需的行为一致? 而当我按下按钮时,图像为什么不会更改?

谢谢。

附言:我的真正问题是在primefaces中集成jcaptcha,我的集成几乎完成,我只缺少用于刷新验证码图像的按钮。


谁在调用getStream方法? - Adarsh
我进行了编辑,不是getStream而是getGraphicText。 - iljkr
2个回答

12

默认情况下,graphicImage 会缓存图像。
在您的 p:graphicImage 上设置 cache 属性为false
就像这样:
<p:graphicImage value="#{dynamicImageController.graphicText}" cache="false" />


@user3147345!你说的火狐浏览器没错。我刚在火狐上测试了一下,关闭缓存对它没有任何影响!这似乎是primefaces实现中的一个bug。顺便问一下,你用的是哪个primefaces版本? - S1LENT WARRIOR
我的也是4.0社区版!我认为我们必须将此错误发布到PrimeFaces Bugs列表中! - S1LENT WARRIOR
1
它对我有效,我的版本是5.1,在ie上没有测试过,但在ff和chrome上可以运行。 - Vineeth NG

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接