如何在java swing中自动更改图像?

时间:2014-03-15 09:37:10

标签: java swing imageicon timertask

您好我正在创建一个java桌面应用程序,我想要显示图像,我希望所有图像应该每5秒自动更改我不知道该怎么做

这是我的代码

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



        }

我怎样才能做到这一点? 提前致谢

2 个答案:

答案 0 :(得分:4)

在此示例中,List<JLabel>保存从List<Icon>中选择的每个图像。在javax.swing.Timer的每一步中,图像列表都被洗牌,每个图像都被分配给一个标签。

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

答案 1 :(得分:1)

实现目标的一种方法是设置swing.Timer每5秒通知其动作侦听器,将您的类设置为计时器的侦听器,并通过使用actionPerformed方法实现actionListener接口,该方法将使用更改所有图像他们的setImage方法。代码应如下所示:

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

}