简体   繁体   English

如何使用java制作图库

[英]How to make an image gallery with java

For class I'm working on my first GUI application. 对于我正在研究我的第一个GUI应用程序。 It's just a simple image viewer with four buttons: Previous, Next, Stop, Play. 它只是一个简单的图像查看器,有四个按钮:上一个,下一个,停止,播放。 Previous and Next work fine, but honestly I don't even know how to begin working on the slideshow part (Play & Stop). 上一个和下一个工作正常,但老实说,我甚至不知道如何开始幻灯片部分(播放和停止)。 I know there's a timer class that would probably be handy for controlling the speed as the images change...but I'm not sure what kind of logic is typically used to cycle through the images. 我知道有一个计时器类,当图像改变时可能很方便控制速度......但我不确定通常使用什么样的逻辑来循环图像。 Can anyone point me in the right direction, my brain is a little fried at this point :0 任何人都可以指出我正确的方向,我的大脑在这一点上有点油炸:0

I've included my code below. 我在下面提供了我的代码。 I'm new to this, so hopefully people won't be too critical of my technique. 我是新手,所以希望人们不会过分批评我的技术。 If it matters, I'm working in eclipse. 如果重要的话,我在日食工作。

here's my code so far: 到目前为止这是我的代码:

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

        }
    }
}

Why complicating simple things, 为什么简单的事情复杂化,

This example shows a start/stop button that controls a javax.swing.Timer . 示例显示了一个控制javax.swing.Timer的开始/停止按钮。 Instead of replacing the label each time, just update the label's Icon , as suggested by @mKorbel and shown here . 而不是每次更换标签,只需按照@mKorbel的建议更新标签的Icon ,并在此处显示。

You need use a thread for the slideshow. 您需要使用线程进行幻灯片放映。 You can use a flag in the run method for continue with the show or stop if this flag change, for example, a boolean var. 如果此标志发生更改,您可以在run方法中使用标志继续show或stop,例如boolean var。 One example you can see in http://java.sun.com/developer/technicalArticles/Threads/applet/ . 您可以在http://java.sun.com/developer/technicalArticles/Threads/applet/中看到一个示例。

These are some guidelines that might get you started: 这些是可以帮助您入门的一些指导原则:

First you will need a separate thread to control the changing images. 首先,您需要一个单独的线程来控制更改的图像。 I suggest you write a class that implements TimerTask . 我建议你写一个实现TimerTask的类。 Override the run() method in this class. 覆盖此类中的run()方法。 In this run method you should put the functionality to change the current image being displayed (similar to what you did in the next and previous function). 在此运行方法中,您应该使用功能来更改当前显示的图像(类似于您在下一个和上一个函数中所做的操作)。

In the actionPerformed() method for the play button you will need to create an instance of a Timer class and start your timer using the scheduleAtFixedRate(TimerTask task, long delay, long period) method (other methods in this class may be used as well, scheduleAtFixedRate() seem more appropriate though). 在播放按钮的actionPerformed()方法中,您需要创建Timer类的实例并使用scheduleAtFixedRate(TimerTask任务,长延迟,长周期)方法启动计时器(此类中的其他方法也可以使用) ,scheduleAtFixedRate()看起来更合适。

For the stop you will then need to add enough functionality to stop the running timer using the cancel() method in the Timer class 对于停止,您需要添加足够的功能以使用Timer类中的cancel()方法停止正在运行的计时器

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM