1

Hi i am creating a java desktop application where i want to show image and i want that all image should change in every 5 sec automatically i do not know how to do this

here is my code

public class ImageGallery extends JFrame
{
    private ImageIcon myImage1 = new ImageIcon ("E:\\SOFTWARE\\TrainPIS\\res\\drawable\\yellow.png");
    private ImageIcon myImage2 = new ImageIcon ("E:\\SOFTWARE\\TrainPIS\\res\\drawable\\d.jpg");
    private ImageIcon myImage3 = new ImageIcon ("E:\\SOFTWARE\\TrainPIS\\res\\drawable\\e.jpg");
    private ImageIcon myImage4 = new ImageIcon ("E:\\SOFTWARE\\TrainPIS\\res\\drawable\f.jpg");
    JPanel ImageGallery = new JPanel();
    private ImageIcon[] myImages = new ImageIcon[4];
    private int curImageIndex=0;

    public ImageGallery ()
        {   
            ImageGallery.add(new JLabel (myImage1));
            myImages[0]=myImage1;
            myImages[1]=myImage2;
            myImages[2]=myImage3;
            myImages[3]=myImage4;

            add(ImageGallery, BorderLayout.NORTH);

            JButton PREVIOUS = new JButton ("Previous");

            JButton NEXT = new JButton ("Next");

            JPanel Menu = new JPanel();
            Menu.setLayout(new GridLayout(1,4));
            Menu.add(PREVIOUS);

            Menu.add(NEXT);

            add(Menu, BorderLayout.SOUTH);



        }

How can i achieve this? Thanks in advance

mKorbel
  • 109,525
  • 20
  • 134
  • 319
  • 2
    Step 1) create an `Image[]`. Step 2) store a current index. Step 3) learn how to use a [`Timer`](http://docs.oracle.com/javase/7/docs/api/javax/swing/Timer.html). Step 4) profit. – Boris the Spider Mar 15 '14 at 09:44

2 Answers2

4

In this example, a List<JLabel> holds each image selected from a List<Icon>. At each step of a javax.swing.Timer, the list of images is shuffled, and each image is assigned to a label.

image

import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javax.swing.Icon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.Timer;
import javax.swing.UIManager;

/**
 * @see http://stackoverflow.com/a/22423511/230513
 * @see http://stackoverflow.com/a/12228640/230513
 */
public class ImageShuffle extends JPanel {

    private List<Icon> list = new ArrayList<Icon>();
    private List<JLabel> labels = new ArrayList<JLabel>();
    private Timer timer = new Timer(1000, new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            update();
        }
    });

    public ImageShuffle() {
        this.setLayout(new GridLayout(1, 0));
        list.add(UIManager.getIcon("OptionPane.errorIcon"));
        list.add(UIManager.getIcon("OptionPane.informationIcon"));
        list.add(UIManager.getIcon("OptionPane.warningIcon"));
        list.add(UIManager.getIcon("OptionPane.questionIcon"));
        for (Icon icon : list) {
            JLabel label = new JLabel(icon);
            labels.add(label);
            this.add(label);
        }
        timer.start();
    }

    private void update() {
        Collections.shuffle(list);
        int index = 0;
        for (JLabel label : labels) {
            label.setIcon(list.get(index++));
        }
    }

    private void display() {
        JFrame f = new JFrame("ImageShuffle");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(this);
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new ImageShuffle().display();
            }
        });
    }
}
trashgod
  • 203,806
  • 29
  • 246
  • 1,045
1

one way of achieving your goal is setting a swing.Timer to notify its action listeners every 5 seconds, set your class to be the listener for the timer and implement the actionListener interface by having an actionPerformed method which will change all images using their setImage method. the code should look like this:

public class ImageGallery extends JFrame implements ActionListener {
Timer timer;

public ImageGallery() {
    timer = new Timer(5000, this);
}

@Override
public void actionPerformed(ActionEvent e) {
    if (e.getSource() == timer) {
        for (int i=0; i<vectorOfImages.size(); i++) {
            vectorOfImages.get(i).setImage(AnotherImage);
        }
    }
}

}

Tom
  • 1,203
  • 4
  • 21
  • 36
  • sorry to ask but what is Another Image –  Mar 15 '14 at 09:52
  • that not an object or anything :) i was just trying to say that you should put the image you want to change to in there – Tom Mar 15 '14 at 09:54
  • what is what is vectorofimages.sze(); –  Mar 15 '14 at 09:57
  • assuming you have a large number of imageIcons you probably would choose to put them inside an array or vector, in that case you should change every imageIcon on that vector.. sze was supposed to be size ill fix that now.. – Tom Mar 15 '14 at 09:59
  • i created array o imageicon and i run loo .lenth it is not working –  Mar 15 '14 at 10:32
  • let us [continue this discussion in chat](http://chat.stackoverflow.com/rooms/49814/discussion-between-tom-and-user3419449) – Tom Mar 15 '14 at 15:57