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

Posted

技术标签:

【中文标题】PRIMEFACES - 如何通过单击 <p:commandButton> 刷新 <p:graphicImage>?【英文标题】:PRIMEFACES - How to refresh a <p:graphicImage> from clicking a <p:commandButton>? 【发布时间】:2014-01-17 17:16:07 【问题描述】:

我正在考虑这个展示:http://www.primefaces.org/showcase/ui/dynamicImage.jsf 特别是子案例“GraphicText on-the-fly”。

我的问题是通过添加一个 .当按下按钮时,我需要图像动态变化。

在 DynamicImageController 类中,我重新编写了与图形图像相关的 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 方法中所需的行为一致? 为什么当我按下按钮时图像没有改变?

谢谢。

ps。我真正的问题是 jcaptcha 在 primefaces 中的集成,我的集成几乎终止了,我只错过了验证码图像的刷新按钮

【问题讨论】:

谁在调用 getStream 方法? 我编辑了,不是getStream而是getGraphicText 【参考方案1】:

默认情况下,graphicImage 会缓存图像。 在您的p:graphicImage 上将cache 属性设置为false 像这样:&lt;p:graphicImage value="#dynamicImageController.graphicText" cache="false" /&gt;

【讨论】:

@user3147345!你对firefox是正确的。我刚刚在firefox上测试了这个,关闭缓存对它没有任何影响!它似乎是 primefaces 实现中的一个错误。顺便说一句,您使用的是哪个 primefaces 版本? 我的也是4.0社区版!我认为我们必须将此错误发布到 PrimeFaces 错误列表! 它对我有用,我的版本是 5.1,没有在 ie 上测试,但在 ff 和 chrome 上工作。【参考方案2】:

好的更新:问题是primefaces的错误我在这里讨论了问题:

http://forum.primefaces.org/viewtopic.php?f=3&t=35637&p=113830#p113830

【讨论】:

以上是关于PRIMEFACES - 如何通过单击 <p:commandButton> 刷新 <p:graphicImage>?的主要内容,如果未能解决你的问题,请参考以下文章

PrimeFaces Datatable单击分页链接取消选中所有复选框

如何在PrimeFaces中找出DataTable是否处于行编辑状态?

Primefaces如何更新对话框中的内容并保持对话框居中?

PrimeFaces 可扩展和可选行

PrimeFaces p:tree使用自定义图标

无法阻止Primefaces民意调查