如何用java制作图像库
在课堂上,我正在开发我的第一个GUI应用程序。它只是一个简单的图像查看器,有四个按钮:上一个、下一个、停止、播放。上一个和下一个工作都很好,但老实说,我甚至不知道如何开始幻灯片部分的工作(播放和停止)。我知道有一个计时器类,它可能很方便控制图像变化时的速度……但我不确定通常使用什么样的逻辑来循环图像。有人能给我指出正确的方向吗?我的大脑在这一点上有点兴奋:0 我在下面包含了我的代码。我是新手,希望大家不要对我的技术太挑剔。如果重要的话,我在eclipse中工作 以下是我目前的代码:如何用java制作图像库,java,swing,image-gallery,Java,Swing,Image Gallery,在课堂上,我正在开发我的第一个GUI应用程序。它只是一个简单的图像查看器,有四个按钮:上一个、下一个、停止、播放。上一个和下一个工作都很好,但老实说,我甚至不知道如何开始幻灯片部分的工作(播放和停止)。我知道有一个计时器类,它可能很方便控制图像变化时的速度……但我不确定通常使用什么样的逻辑来循环图像。有人能给我指出正确的方向吗?我的大脑在这一点上有点兴奋:0 我在下面包含了我的代码。我是新手,希望大家不要对我的技术太挑剔。如果重要的话,我在eclipse中工作 以下是我目前的代码: import
import javax.swing.*;
导入java.awt.*;
导入java.awt.event.*;
导入java.util.TimerTask;
公共类ImageGallery扩展JFrame
{
private ImageIcon myImage1=新的ImageIcon(“jummy.jpg”);
私有ImageIcon myImage2=新的ImageIcon(“Desert.jpg”);
private ImageIcon myImage3=新的ImageIcon(“jellyphish.jpg”);
private ImageIcon myImage4=新的ImageIcon(“Penguins.jpg”);
JPanel ImageGallery=新的JPanel();
私有图像图标[]myImages=新图像图标[4];
私有整数索引=0;
公众影像廊()
{
添加(新JLabel(myImage1));
myImages[0]=myImage1;
myImages[1]=myImage2;
myImages[2]=myImage3;
myImages[3]=myImage4;
添加(ImageGallery,BorderLayout.NORTH);
JButton-PREVIOUS=新JButton(“PREVIOUS”);
JButton PLAY=新JButton(“PLAY”);
JButton STOP=新JButton(“STOP”);
JButton NEXT=新JButton(“NEXT”);
JPanel菜单=新建JPanel();
设置布局(新的网格布局(1,4));
菜单。添加(上一个);
菜单。添加(播放);
菜单。添加(停止);
菜单。添加(下一步);
添加(菜单,BorderLayout.SOUTH);
//寄存器侦听器
PreviousButtonListener PreviousButton=新的PreviousButtonListener();
PlayButtonListener PlayButton=新的PlayButtonListener();
StopButtonListener StopButton=新的StopButtonListener();
NextButtonListener NextButton=新的NextButtonListener();
//将侦听器添加到相应的组件集中
PREVIOUS.addActionListener(PreviousButton);
PLAY.addActionListener(播放按钮);
addActionListener(停止按钮);
NEXT.addActionListener(NextButton);
}
公共静态void main(字符串[]args)
{
ImageGallery框架=新建ImageGallery();
框架设置尺寸(490430);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(空);
}
类PreviousButtonListener实现ActionListener
{
已执行的公共无效操作(操作事件e)
{
如果(curImageIndex>0&&curImageIndex=0&&curImageIndex<3)
{ImageGallery.remove(0);
curImageIndex=curImageIndex+1;
图像图标图像=我的图像[图像索引];
添加(新JLabel(TheImage));
ImageGallery.validate();
ImageGallery.repaint();
}
其他的
{
ImageGallery.remove(0);
添加(新JLabel(myImage4));
库里马指数=3;
ImageGallery.validate();
ImageGallery.repaint();
}
}
}
}
您需要为幻灯片放映使用一个线程。如果此标志更改,您可以在run方法中使用标志继续显示或停止,例如布尔变量。您可以在中看到一个示例。以下是一些指导原则,可以帮助您开始:
首先,您需要一个单独的线程来控制不断变化的图像。我建议您编写一个实现的类。重写此类中的run()方法。在这个运行方法中,您应该使用功能来更改当前显示的图像(类似于您在下一个和上一个函数中所做的操作)
在play button的actionPerformed()方法中,您需要创建一个Timer类的实例,并使用scheduleAtFixedRate(TimerTask,long delay,long period)方法启动计时器(但也可以使用此类中的其他方法,scheduleAtFixedRate()似乎更合适)
对于停止,您需要添加足够的功能,使用timer类中的cancel()方法停止正在运行的计时器
- 我认为这是一个为幻灯片放映工作的地方
- 把图像放到
javax.swing.Timer
。不要每次都更换标签,只需更新标签的图标,如@mKorbel所示。不要将java.util.Timer
用于Swing,尽量避免使用它,因为通过它进行Swing更新将成为您的一大难题,因为您必须在EDT事件调度程序线程上执行这些更新。试试看,这里有一个小程序可以帮助你进行与Swing相关的操作,你最好使用Swing定时器。由于所有与Swing相关的操作都应该在EDT上进行,Swing计时器会为您解决这一问题,因此您不确定CardLayout
是否是最佳选择。这意味着您将所有图像都存储在内存中,并且根据要查看的图像的大小/数量,可能会消耗大量内存。在这种情况下,我会选择边框布局
,并始终替换image@Robin有1)内存用于已加载的图像2)图形2)D内存3)一些
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();
}
}
}
}