【问题标题】:Java Server Faces Loading images from arrayJava Server Faces从数组加载图像
【发布时间】:2012-04-07 05:36:17
【问题描述】:

我有一个 ImageBean 类,我想用它从数组中加载图像。我已经用图像(总共 9 个)预加载了数组,并且希望每次刷新浏览器时连续显示一张图像。图像被命名为'1.jpg,2.jpg'等 (即图像'1'-点击刷新,图像'2'点击刷新,......图像'9')。任何帮助将不胜感激。谢谢。

import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import java.io.Serializable;
import java.util.ArrayList;
import javax.imageio.ImageIO;

@ManagedBean(name="ImageBean")
@SessionScoped
public class ImageBean implements Serializable 
{
    private static final long serialVersionUID = 1L;
    ArrayList<Image> myArr = new ArrayList<Image>();
    BufferedImage img = null;

    public ImageBean()
    {
        for(int i = 1; i < 10; i++)
        {
            try 
            {
                img = ImageIO.read(new File(i + ".jpg"));
            } 
            catch (IOException ex) {}

            myArr.add(img);
        }
    }

    public BufferedImage getImage(int i) 
    {
        return (BufferedImage) myArr.get(i);
    }
}

编辑 1

我稍微编辑了代码,所以我使用 BufferedImage 数组而不是 ArrayList。现在我没有收到错误,但图像没有显示在浏览器中。

public class ImageBean implements Serializable 
{
    private static final long serialVersionUID = 1L;
    BufferedImage[] myArr = new BufferedImage[9];

    public ImageBean()
    {
        for(int i = 0; i < 9; i++)
        {
            try 
            {
                myArr[i] = (ImageIO.read(new File(i+1 + ".jpg")));
            } 
            catch (IOException ex) {}
        }
    }

    public BufferedImage getImage(int i) 
    {
        return (BufferedImage) myArr[i];
    }
}

【问题讨论】:

标签: java jsf-2 javabeans


【解决方案1】:

一个简单的解决方案是添加一个变量来保存当前图像并获取下一张图像...(请记住为最后一张图像重置)

@SessionScoped
public class ImageBean implements Serializable 
{
    private static final long serialVersionUID = 1L;
    ArrayList<Image> myArr = new ArrayList<Image>();
    BufferedImage img = null;

    private int currImgId = 1;

    public ImageBean()
    {
        for(int i = 1; i < 10; i++)
        {
            try 
            {
                img = ImageIO.read(new File(i + ".jpg"));
            } 
            catch (IOException ex) {}

            myArr.add(img);
        }
    }

  public BufferedImage getImage() 
  {
    // Reset logic would go here...probably best with array.size...
    return (BufferedImage) myArr.get(currImgId++);
  }

}

【讨论】:

  • 感谢您的回复。我认为问题出在我的 Java 服务器页面上。 code code 是我在 JSP 类中的内容,我确定它是错误的.
  • 可能会造成 ArrayOutOfBonds 错误,因为这会持续超过 8 点。
  • 对JSP类有什么建议吗?
  • 那么你的问题是 h:graphicImage 是为 URL 而不是二进制数据设计的,所以你要么创建一个 Servlet 来获取图像(参见here 以获取参考,或者使用类似richFaces(here) 或素面等。
  • @omegaFlame,还有一件事请听传奇,在执行 currImgId++ 之前,您必须将 getImage 代码替换为检查 ArraySize 的代码。还有一件事(正如我最近被告知的...... )因为您是新来的,所以不要忘记将答案标记为已接受(实际上是最有帮助的答案..如果有的话..;-))..
【解决方案2】:
public ImageBean()
    {
        for(int i = 1; i < 10; i++)
        {
            try 
            {
                myArr.add(ImageIO.read(new File(i + ".jpg")));
            } 
            catch (IOException ex) {}
        }
    }

最初如果失败,它将继续添加上一个图像。这可能使其“冻结”,因为它实际上会遍历图像,但实际上只是显示相同。

【讨论】:

  • 感谢您的回复。但是现在我在浏览器中抛出 java.lang.IndexOutOfBoundsException: Index: 0, Size: 0 。有任何想法吗?谢谢
  • 我有一个 JSF 页面,其中有一行 在我的正文中相信这就是原因。
猜你喜欢
  • 2012-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-30
  • 1970-01-01
相关资源
最近更新 更多