[英]How to make an image gallery with java
对于我正在研究我的第一个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();
}
}
}
}
为什么简单的事情复杂化,
我认为这是CardLayout的工作,幻灯片显示是Swing Timer
您需要使用线程进行幻灯片放映。 如果此标志发生更改,您可以在run方法中使用标志继续show或stop,例如boolean var。 您可以在http://java.sun.com/developer/technicalArticles/Threads/applet/中看到一个示例。
这些是可以帮助您入门的一些指导原则:
首先,您需要一个单独的线程来控制更改的图像。 我建议你写一个实现TimerTask的类。 覆盖此类中的run()方法。 在此运行方法中,您应该使用功能来更改当前显示的图像(类似于您在下一个和上一个函数中所做的操作)。
在播放按钮的actionPerformed()方法中,您需要创建Timer类的实例并使用scheduleAtFixedRate(TimerTask任务,长延迟,长周期)方法启动计时器(此类中的其他方法也可以使用) ,scheduleAtFixedRate()看起来更合适。
对于停止,您需要添加足够的功能以使用Timer类中的cancel()方法停止正在运行的计时器
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.