not redisplaying an image s

2019-01-20 16:26发布

问题:

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);


    }

}

回答1:

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();
            }
        });
    }
}


回答2:

The whole if (i == ... part can be simplified. Declare a static class member in SlideShowGUI:

private final static ImageIcon[] icons = {new ImageIcon("galileo1.jpg"),
                                          new ImageIcon("galileo2.jpg"),
                                          new ImageIcon("galileo3.jpg"),
                                          new ImageIcon("galileo4.jpg")};

and use it in the replacement of the if statements:

images.setIcon(icons[i-1]);
System.printf("Picture %s should be displayed%n", i-1);
if (i == 4) {
  i = 0;
}


回答3:

You can simplify your code as Andreas_D mentioned.

Your current design will block the main thread as you call Thread.sleep() to it, this will freeze your application.

If you would like to update the Image, you should implement the update code inside run() method.

So if you detect the user press on submit JButton, create and start the new Thread for updating UI.