5

对于课程,我正在开发我的第一个 GUI 应用程序。它只是一个简单的图像查看器,有四个按钮:上一个、下一个、停止、播放。上一个和下一个工作正常,但老实说,我什至不知道如何开始处理幻灯片部分(播放和停止)。我知道有一个计时器类可能很方便控制图像变化时的速度……但我不确定通常使用哪种逻辑来循环浏览图像。谁能指出我正确的方向,此时我的大脑有点炸:0

我在下面包含了我的代码。我是新手,所以希望人们不会对我的技术太挑剔。如果重要的话,我正在日食中工作。

到目前为止,这是我的代码:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.TimerTask;


public class ImageGallery extends JFrame
{
    private ImageIcon myImage1 = new ImageIcon ("Chrysanthemum.jpg");
    private ImageIcon myImage2 = new ImageIcon ("Desert.jpg");
    private ImageIcon myImage3 = new ImageIcon ("Jellyfish.jpg");
    private ImageIcon myImage4 = new ImageIcon ("Penguins.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 PLAY = new JButton ("Play");
            JButton STOP = new JButton ("Stop");
            JButton NEXT = new JButton ("Next");

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

            add(Menu, BorderLayout.SOUTH);

            //register listener
            PreviousButtonListener PreviousButton = new PreviousButtonListener ();
            PlayButtonListener PlayButton = new PlayButtonListener ();
            StopButtonListener StopButton = new StopButtonListener ();
            NextButtonListener NextButton = new NextButtonListener ();

            //add listeners to corresponding componenets 
            PREVIOUS.addActionListener(PreviousButton);
            PLAY.addActionListener(PlayButton);
            STOP.addActionListener(StopButton);
            NEXT.addActionListener(NextButton);

        }

    public static void main (String [] args)
        {
            ImageGallery frame = new ImageGallery();

            frame.setSize(490,430);
            frame.setVisible(true);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setLocationRelativeTo(null);
        }



    class PreviousButtonListener implements ActionListener 
    {

        public void actionPerformed(ActionEvent e)
            {
                if(curImageIndex>0 && curImageIndex <= 3)
                    {   ImageGallery.remove(0);
                        curImageIndex=curImageIndex-1;
                        ImageIcon TheImage= myImages[curImageIndex];
                        ImageGallery.add(new JLabel (TheImage));
                        ImageGallery.validate();
                        ImageGallery.repaint(); 
                    }
                else 
                    {   
                        ImageGallery.remove(0);
                        ImageGallery.add(new JLabel (myImage1));
                        curImageIndex=0;
                        ImageGallery.validate();
                        ImageGallery.repaint();
                    }
            }
    }

    class PlayButtonListener implements ActionListener 
    {
        public void actionPerformed(ActionEvent e)
            {
                        // *need help here*//

            }
    }

    class StopButtonListener implements ActionListener 
    {
        public void actionPerformed(ActionEvent e)
            {
                        // *need help here*//
            }
    }

    class NextButtonListener implements ActionListener 
    {


        public void actionPerformed(ActionEvent e)
        {

            if(curImageIndex>=0 && curImageIndex < 3)
                {   ImageGallery.remove(0);
                    curImageIndex = curImageIndex + 1;
                    ImageIcon TheImage= myImages[curImageIndex];
                    ImageGallery.add(new JLabel (TheImage));
                    ImageGallery.validate();
                    ImageGallery.repaint(); 
                }
            else 
                {   
                    ImageGallery.remove(0);
                    ImageGallery.add(new JLabel (myImage4));
                    curImageIndex=3;
                    ImageGallery.validate();
                    ImageGallery.repaint();
                }

        }
    }
}
4

4 回答 4

5

为什么要把简单的事情复杂化,

于 2012-04-23T05:44:10.127 回答
3

示例显示了一个控制javax.swing.Timer. 正如@mKorbel 所建议并在此处显示的那样,只需更新标签,而不是每次都替换标签。Icon

于 2012-04-23T07:36:30.873 回答
1

您需要为幻灯片使用线程。您可以在 run 方法中使用一个标志来继续显示或在此标志更改时停止,例如布尔变量。您可以在http://java.sun.com/developer/technicalArticles/Threads/applet/中看到一个示例。

于 2012-04-23T05:11:35.047 回答
0

以下是一些可以帮助您入门的指南:

首先,您需要一个单独的线程来控制不断变化的图像。我建议你编写一个实现TimerTask的类。覆盖此类中的 run() 方法。在此运行方法中,您应该放置更改当前显示的图像的功能(类似于您在下一个和上一个功能中所做的)。

在播放按钮的 actionPerformed() 方法中,您需要创建 Timer 类的实例并使用 scheduleAtFixedRate(TimerTask task, long delay, long period) 方法启动计时器(也可以使用此类中的其他方法, scheduleAtFixedRate() 似乎更合适)。

对于停止,您需要添加足够的功能来使用 Timer 类中的 cancel() 方法停止正在运行的计时器

于 2012-04-23T05:13:56.280 回答