Java帮助。幻灯片以不规则的间隔播放

时间:2015-03-16 16:06:28

标签: java image timer slideshow slide

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


public class slide extends JFrame

{

ImageIcon[] iconArray = new ImageIcon[25];
int iconIndex = 0;
JLabel label;
JPanel panel;

slide ()
{
    panel = new JPanel();
    label = new JLabel();

    add(panel);
    setTitle("Slide Show");
    panel.add(label);

for(int i = 0; i < iconArray.length; i++)

    {

    iconArray[i] = new ImageIcon("C:/SlideShow/slide0.jpg");

    }


        Timer timer = new Timer(1000, new TimerListener());
        timer.start();



}
private class TimerListener implements ActionListener
{
    public void actionPerformed(ActionEvent actionEvent)
    {
        label.setIcon(iconArray[iconIndex]);
        iconIndex++ ;
        if(iconIndex == 25)
            iconIndex = 0;

    }
}
public static void main(String[] args)
{
     slide frame = new slide();
    frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
    frame.setVisible(true);
    frame.setSize(800, 600);
    frame.setLocationRelativeTo(null);
}
}

任何想法如何制作幻灯片以显示不同的&gt; &GT;时间间隔?例如,对于第一张图片,1秒,对于第一张图片,为200毫秒。 &GT;接下来,第三个等等3秒等等。 &GT; &GT; &GT;非常感谢你的帮助!!!

1 个答案:

答案 0 :(得分:0)

Swing计时器最多有两个延迟。您可以设置初始延迟和间隔延迟。

线程让您可以更好地控制图像之间的睡眠时间。

这是开发幻灯片放映查看器的一种方法,允许您设置每个图像的延迟。我使用了来自互联网的3张图像来测试观众。

package com.ggl.testing;

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.IOException;
import java.net.URL;

import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class Slideshow implements Runnable {

    private JFrame frame;

    private SSImage[] imageArray;

    private SSShower showImages;

    private SSViewer imageViewer;

    public Slideshow() {
        this.imageArray = new SSImage[3];

        Image image0 = null;
        Image image1 = null;
        Image image2 = null;

        try {
            image0 = ImageIO.read(new URL(
                    "http://www.ericofon.com/collection/collection1.jpg"));
            image1 = ImageIO
                    .read(new URL(
                            "http://magiclinks1.wikispaces.com/file/view"
                                    + "/collection11_lg.jpg/219833158/collection11_lg.jpg"));
            image2 = ImageIO
                    .read(new URL(
                            "http://www.pokelol.com/wp-content/uploads/2011/12"
                                    + "/my_pokemon_collection_by_pa_paiya-d4iiuo5.jpg"));
        } catch (IOException e) {
            e.printStackTrace();
            return;
        }

        imageArray[0] = new SSImage(image0, 4000L);
        imageArray[1] = new SSImage(image1, 2500L);
        imageArray[2] = new SSImage(image2, 1500L);
    }

    @Override
    public void run() {
        frame = new JFrame("Check Box Test");
        frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
        frame.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent event) {
                exitProcedure();
            }
        });

        imageViewer = new SSViewer(700, 700);

        frame.add(imageViewer);

        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);

        showImages = new SSShower(imageArray, imageViewer);
        new Thread(showImages).start();
    }

    private void exitProcedure() {
        showImages.setRunning(false);
        frame.dispose();
        System.exit(0);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Slideshow());
    }

    public class SSImage {

        private final long delay;

        private final Image image;

        public SSImage(Image image, long delay) {
            this.image = image;
            this.delay = delay;
        }

        public long getDelay() {
            return delay;
        }

        public Image getImage() {
            return image;
        }

    }

    public class SSViewer extends JPanel {

        private static final long serialVersionUID = -7893539139464582702L;

        private Image image;

        public SSViewer(int width, int height) {
            this.setPreferredSize(new Dimension(width, height));
        }

        public void setImage(Image image) {
            this.image = image;
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);

            g.drawImage(image, (this.getWidth() - image.getWidth(this)) / 2,
                    (this.getHeight() - image.getHeight(this)) / 2, this);
        }
    }

    public class SSShower implements Runnable {

        private int counter;

        private volatile boolean running;

        private SSViewer ssviewer;

        private SSImage[] imageArray;

        public SSShower(SSImage[] imageArray, SSViewer ssviewer) {
            this.imageArray = imageArray;
            this.ssviewer = ssviewer;
            this.counter = 0;
            this.running = true;
        }

        @Override
        public void run() {
            while (running) {
                SSImage ssimage = imageArray[counter];
                ssviewer.setImage(ssimage.getImage());
                repaint();
                sleep(ssimage.getDelay());
                counter = ++counter % imageArray.length;
            }
        }

        private void repaint() {
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    ssviewer.repaint();
                }
            });
        }

        private void sleep(long delay) {
            try {
                Thread.sleep(delay);
            } catch (InterruptedException e) {

            }
        }

        public synchronized void setRunning(boolean running) {
            this.running = running;
        }
    }

}