Отображение нескольких изображений из базы данных в Java - PullRequest
3 голосов
/ 19 февраля 2012

Хорошо, поэтому у меня нет проблем с получением одного изображения из базы данных. Я использую это, чтобы вернуть его как ImageIcon на JLabel;

while (rs.next()) {
images = rs.getString("path");
System.out.println(images + "\n");
System.out.println("TESTING - READING IMAGE");
BufferedImage img = ImageIO.read(new File(images));
System.out.println("img = " + images);
imagelabel = new JLabel(new ImageIcon(img));
imagelabel.setPreferredSize(new Dimension(200, 200));
imageselect.add(imagelabel);

Однако мне нужно сделать это с несколькими изображениями и назначить каждому JLabel новый JPanel в CardLayout. Я знаю, что мне нужен какой-то цикл, в поисках предложений, как лучше всего это сделать!

BufferedImage imgA = ImageIO.read(new File("lmkpackage/images/one.jpg"));
            image1 = new JLabel(new ImageIcon(imgA));
            image1.setPreferredSize(new Dimension(200, 200));
            img1 = new JPanel();        
            img1.add(image1);

            loadcard.add(img1,"1");
            cl2.show(loadcard,"1");

            BufferedImage imgB = ImageIO.read(new File("lmkpackage/images/two.jpg"));
            image2 = new JLabel(new ImageIcon(imgB));
            image2.setPreferredSize(new Dimension(200, 200));
            img2 = new JPanel();        
            img2.add(image2);

            loadcard.add(img2, "2");

            BufferedImage imgC = ImageIO.read(new File("lmkpackage/images/three.jpg"));
            image3 = new JLabel(new ImageIcon(imgC));
            image3.setPreferredSize(new Dimension(200, 200));
            img3 = new JPanel();        
            img3.add(image3);

            loadcard.add(img3, "3");

            BufferedImage imgD = ImageIO.read(new File("lmkpackage/images/four.jpg"));
            image4 = new JLabel(new ImageIcon(imgD));
            image4.setPreferredSize(new Dimension(200, 200));
            img4 = new JPanel();
            img4.add(image4);

            loadcard.add(img4, "4");

            BufferedImage imgE = ImageIO.read(new File("lmkpackage/images/five.jpg"));

            image5 = new JLabel(new ImageIcon(imgE));
            image5.setPreferredSize(new Dimension(200, 200));
            img5 = new JPanel();        
            img5.add(image5);

            loadcard.add(img5, "5");

Вот моя попытка сделать это в соответствии с просьбой:

while (rs.next()) {
                        images = rs.getString("path");
                        System.out.println(images + "\n");
                        System.out.println("TESTING - READING IMAGE");
                        for(i=0; i < 5; i++){                       
                        BufferedImage img[i] = ImageIO.read(new File(images));
                        imglab[i] = new JLabel(new ImageIcon(imgIcon[i]));
                        imgPanel[i]= new JPanel();
                        imgPanel[i].add(imglab[i]);
                        loadcard.add(imgPanel[i], i);                                       
                        }//End For
                    }//EndWhile

И ошибки, которые я получаю:

letmeknow.java: 181: ']' ожидаемый BufferedImage img [i] = ImageIO.read (новый файл (изображения)); letmeknow.java:181: недопустимое начало выражения BufferedImage img [i] = ImageIO.read (новый файл (изображения));

1 Ответ

5 голосов
/ 19 февраля 2012

Эта строка не имеет смысла:

BufferedImage img[i] = ImageIO.read(new File(images));

, поскольку вы, похоже, пытаетесь одновременно объявить и использовать массив, и это говорит о том, что вам следует пересмотреть базовый учебник по Java по использованиюмассивы, поскольку эта база знаний является критической и должна быть хорошо известна, прежде чем пытаться либо программировать базу данных, либо программировать на Swing GUI.

Чтобы решить эту проблему, объявите свой массив (или, возможно, лучше - ArrayList )BufferedImage до цикла while, а затем использовать его внутри цикла.Например:

// !!! CAVEAT: code not compiled nor tested !!!

// TOTAL_IMAGE_COUNT is a constant that defines the array size
// an ArrayList might be better though
BufferedImage[] myImages = new BufferedImage[TOTAL_IMAGE_COUNT];
int i = 0;
while (rs.next()) {
    String imagePath = rs.getString("path");
    System.out.println(imagePath + "\n");
    System.out.println("TESTING - READING IMAGE");

    myImages[i] = ImageIO.read(new File(imagePath));
    imglab[i] = new JLabel(new ImageIcon(myImages[i]));
    imgPanel[i]= new JPanel();
    imgPanel[i].add(imglab[i]);
    loadcard.add(imgPanel[i], i);     
    i++;                 
}//EndWhile

Хотя все эти массивы могут даже не понадобиться, если все, что вы делаете, это добавляете JPanels в CardLayout.И мне немного странно, что вы храните путь к файлу изображения в базе данных, а не само изображение.Ваши имена файлов изображений кажутся достаточно тривиальными, что, возможно, база данных даже не нужна.Возможно, все, что вам нужно, это что-то очень простое:

  String imageLocation = "lmkpackage/images/";
  String[] imageNames = {"one", "two", "three", "four", "five"};
  String imgExt = ".jpg";

  int count = 1;

  for (String imageName : imageNames) {
     String imagePath = imageLocation + imageName + imgExt;
     BufferedImage img = ImageIO.read(new File(imagePath));
     ImageIcon icon = new ImageIcon(img);
     JLabel label = new JLabel(icon);
     loadcard.add(label, String.valueOf(count));
     count++;
  }
...