Search code examples
javaswingarraylistjpanelswingx

I want to iterate through an arraylist of Images


I have an arraylist of images, I am trying to have each image, slide through the screen repeatedly..

public class GraphicsT extends JPanel implements ActionListener {

    Timer timer = new Timer(1, this);
    Image image;
    Image image2;
    int x1;
    int x2;
    int y1;
    int y2;
    int num;

    List<String> imageList1 = new ArrayList<String>();

    GraphicsT() {
        imageList1.add("image/java.jpeg");
        imageList1.add("image/slide.jpg");
        imageList1.add("image/giphy.gif");
        x1 = 100;
        y1 = 100;
        x2 = 200;
        y2 = 200;
        num = 0;
    }

    public void paint(Graphics g) {

        ImageIcon i2 = new ImageIcon("image/street.jpg");
        image2 = i2.getImage();
        g.drawImage(image2, 0, 0, null);

        for (int i = 1; i < imageList1.size(); i++) {

            ImageIcon im = new ImageIcon(imageList1.get(i));
            image = im.getImage();
            g.drawImage(image, x1, y1, x2, y2, 100, 120, 120, 240, null);

            System.out.println(imageList1.get(i));

        }
        timer.start();

    }

    @Override
    public void actionPerformed(ActionEvent e) {
        num++;
        if (num % 100 == 0) {
            x1 = x1 + 10;
            x2 = x2 + 10;
        }

        if (x2 >= 570) {
            // end reached
            x1 = 0;
            x2 = 100;
        }

        repaint();

    }
}


public class GraphicsApp extends JFrame {

    GraphicsT gt = new GraphicsT();

    public GraphicsApp() {
        this.setTitle("Multiple Slide");
        this.setSize(450, 400);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);
        this.add(gt);
    }

    public static void main(String[] args) {
        new GraphicsApp();
    }

}

my current code can only pick one image, but i want a situation whereby after the first images goes out of the screen, the second image can follow, then the third, and so on...

Please help will be much appreciated.


Solution

  • Several issues:

    1. you should be overriding paintComponent() not paint() and you invoke super.paintComponent(...) to make sure the background is painted first.

    2. a painting method is for painting only. You should NOT be doing I/O to read the images. The images should be read in the constructor of your class

    3. You should NOT start the Timer in the painting method. The Timer is started in the constructor.

    4. Your basic painting code is wrong. You should have a couple of instance variables, a) the "currentImage", b) "imageNumber". Then in the painting method you simply paint the currentImage at the x/y location.

      In the ActionListener, when the image is off the screen you increment the "imageNumber" and copy the image from the ArrayList to the "currentImage". Then you reset the x/y location so the image is painted starting from the right.

      When the "imageNumber" reaches the end of the ArrayList you reset it back to 0.