Search code examples
javaswingimageicon

not redisplaying an image s


Hi everybody I am a bit of stack here. When I run the program and press the button submit it is supposed to change 4 pictures in every 2 seconds.However it is not redisplaying the images. If anyone can give me a hand it would be great. I am using eclipse and the program is compiling and running. Here is the code.

/** Here is the GUI of the program
 * class name SlideShowGui.java
 * @author Kiril Anastasov
 * @date 07/03/2012
 */

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;   

public class SlideShowGui extends JPanel  implements ActionListener, Runnable
{
    JLabel name, comments, images;
    JTextField namejtf, commentsjtf, captionjtf;
    JButton submit;
    ImageIcon pictures1, pictures2, pictures3, pictures4;
    //ImageIcon []pictures2 = {galileo1.jpg};


    SlideShowGui()
    {


        name = new JLabel("Name:");
        this.add(name);

        namejtf = new JTextField(15);
        this.add(namejtf);

        comments = new JLabel("Comments:");
        this.add(comments);

        commentsjtf = new JTextField(15);
        this.add(commentsjtf);

        submit = new JButton("Submit");
        this.add(submit);
        submit.addActionListener(this);


        pictures1 = new ImageIcon("galileo1.jpg");
        images = new JLabel(pictures1);
        this.add(images);


        pictures2 = new ImageIcon("galileo2.jpg");
        this.add(images);
        pictures3 = new ImageIcon("galileo3.jpg");
        this.add(images);
        pictures4 = new ImageIcon("galileo4.jpg");
        this.add(images);



        captionjtf = new JTextField(24);
        this.add(captionjtf);
        //pictures = new ImageIcon("galileo1.jpg");
       // images.setIcon(pictures);  
    }

    public void actionPerformed(ActionEvent ae)
    {
        Thread t = new Thread(this);
        t.start();

        if(ae.getSource() == submit)
        {

            int i = 0;
            boolean go = true;
            while(go)
            {

                i++;
                System.out.println(i);

                try 
                { 
                    Thread.sleep(2000);

                      if(i == 1)
                      {
                            pictures1 = new ImageIcon("galileo1.jpg");
                            images.setIcon(pictures1);                                                                                                      
                            System.out.println("picture 1 should be displayed here");
                      }
                      if(i == 2)
                      {
                            pictures2 = new ImageIcon("galileo2.jpg");
                            images.setIcon(pictures2);   
                            System.out.println("picture 2 should be displayed here");

                      }
                      if(i == 3)
                      {
                           pictures3 = new ImageIcon("galileo3.jpg");
                            images.setIcon(pictures3);   
                           System.out.println("picture 3 should be displayed here");  
                      }
                      if(i == 4)
                      {
                            pictures4 = new ImageIcon("galileo4.jpg");
                            images.setIcon(pictures4);   
                           System.out.println("picture 4 should be displayed here");  
                      }


                      if(i == 4)
                      {
                              i = 0;
                      }


                } 
                catch (InterruptedException ie) 
                {
                     System.out.println("thread exception");
                }

        }
    }

}

    public void run() 
    {

    }
}

/**The driver class of the program. Here is the JFrame 
 * class name TestSlideShow.java
 * @author Kiril Anastasov
 * @date 07/03/2012
 */

import java.awt.*;
import javax.swing.*;
public class TestSlideShow 
{
    public static void main(String[] args) 
    {
        JFrame application = new JFrame();
        SlideShowGui panel = new SlideShowGui();
        application.add(panel);
        application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        application.setSize(300,600);
        application.setLocation(400,100);
        application.setVisible(true);


    }

}

Solution

  • Always use javax.swing.Timer never use Thread.sleep(...) in Swing atleast. Here try this code, but do replace the path to your images :

    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    
    public class SlideShow extends JPanel
    {
        private int i = 0;
        private Timer timer;
        private JLabel images = new JLabel();
        private Icon bg = UIManager.getIcon("OptionPane.warningIcon");
        private Icon red = UIManager.getIcon("OptionPane.errorIcon");
        private Icon blue =  UIManager.getIcon("OptionPane.informationIcon");
        private ImageIcon pictures1, pictures2, pictures3, pictures4;
        private ActionListener action = new ActionListener()
        {
            public void actionPerformed(ActionEvent ae)
            {           
    
                boolean go = true;
    
                i++;
                System.out.println(i);
    
                if(i == 1)
                {
                    images.setIcon(bg);                                                                                                      
                    System.out.println("picture 1 should be displayed here");
                }
                if(i == 2)
                {
                    images.setIcon(red);   
                    System.out.println("picture 2 should be displayed here");
                }
                if(i == 3)
                {
                    images.setIcon(blue);   
                    System.out.println("picture 3 should be displayed here");  
                }
                if(i == 4)
                {
                    images.setIcon(bg);   
                    System.out.println("picture 4 should be displayed here");  
                }
                if(i == 5)
                {
                    go = false;
                    timer.stop();
                    System.exit(0);
                }
                revalidate();
                repaint();
            }
        };
    
        public SlideShow()
        {
            JFrame frame = new JFrame("SLIDE SHOW");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setLocationByPlatform(true);
    
            frame.getContentPane().add(this);
    
            add(images);
    
            frame.setSize(300, 300);
            frame.setVisible(true); 
            timer = new Timer(2000, action);    
            timer.start();  
        }
    
        public static void main(String... args)
        {
            SwingUtilities.invokeLater(new Runnable()
            {
                public void run()
                {
                    new SlideShow();
                }
            });
        }
    }