刚学到JavaSwing图片绘制,于是自己做了个简易的图片查看器小程序,在这里分享给大家,请多多指教。

话不多说先上部分图:

Java 如何找图片文件 java怎么实现图片的查看_JavaSwing

Java 如何找图片文件 java怎么实现图片的查看_JavaSwing_02

绘制图片需要自定义一个控件,我们这里写一个继承自JPanel的类,重写paintComponent()函数。

获取图片有三种方式:资源文件、本地文件和Http文件,这里为了方便我只写了本地文件方法,因为我觉得图片查看的话还是本地文件有用。下面代码中注释掉的是资源文件的使用方法。

import java.awt.Graphics;
import java.awt.Image;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;

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

public class MyPanel extends JPanel
{
	public ArrayList<Image> ImgList;	//创建一个Image列表,用于存储图片资源
	//public String[] srcPath = {"/images/hwj.jpg", "/images/tank.jpg", "/images/F-22.jpg"};     //资源文件
	public String[] loadPath = new String[10];    //创建一个数组用于存放本地文件路径
	public int index = 0;	//图片索引,用于判断图片位置
	public MyPanel()
	{
		addFile();	//初始化文件
		try
		{
			ImgList = ImageFromFile(loadPath);	//获得图片列表
		} catch (IOException e)
		{
			e.printStackTrace();
		}
	}
	@Override
	protected void paintComponent(Graphics g)
	{
		//获得窗口的宽高
		int width = this.getWidth();
		int height = this.getHeight();
		
		//清除控件显示,在下次重新绘制的时候清除当前显示,不然会出现图片重叠现象
		g.clearRect(0, 0, width, height);
		
		if(!ImgList.isEmpty())	//判断列表是否为空
		{
			//绘制图片,参数:图片资源,x坐标,y坐标,宽,高,暂时用不到传入null
			g.drawImage(ImgList.get(index), 0, 0, width, height, null);
		}
		
	}
	/**
	 * 获取资源文件
	 * */
	/*public ArrayList<Image> ImageFromResource(String[] path) throws IOException
	{
		ArrayList<Image> list = new ArrayList<>();	//创建一个Image类型的数组链表用于接收Image对象
		for(String filepath: path)	//遍历传入的路径
		{
			URL url = getClass().getResource(filepath);	//加载URL资源文件
			Image image = ImageIO.read(url);	//使用ImageIO工具类读取URL
			list.add(image);	//将Image对象添加到列表中
		}
		return list;
	}*/
	/**
	 * 获取本地文件
	 * */
	public ArrayList<Image> ImageFromFile(String[] path) throws IOException
	{
		ArrayList<Image> list = new ArrayList<>();	//创建一个Image类型的数组链表用于接收Image对象
		for(String filepath: path)	//遍历传入的路径
		{
			Image image = ImageIO.read(new File(filepath));	//使用ImageIO工具类读取文件路径
			list.add(image);	//将Image对象添加到列表中
		}
		return list;
	}
	/**
	 * 添加文件,由于文件过多且名称变化不大,所以我用了遍历的方法给路径数组添加值
	 * */
	public void addFile()
	{
		for(int i = 0; i < loadPath.length; i ++)
		{
			loadPath[i] = "D:/Google_Download/mxt" + (i + 1) +".jpg";    //我的文件名为:mxtx.jpg x为数字
		}
	}
}

 下面写Frame的主体,编写一个继承自JFrame的类,用于生成窗口,及内容和布局方式

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JFrame;


public class MyFrame extends JFrame
{
	MyPanel panel = new MyPanel();	//实例自定义控件对象
	
	public MyFrame(String title)
	{
		super(title);
		
		Container root = getContentPane();
		//设置布局为BorderLayout,中间显示图片,下方显示控制按钮
		root.setLayout(new BorderLayout());	
		
		Box box = Box.createHorizontalBox();	//创建一个Box水平布局用于存放两个按钮
		JButton next = new JButton("下一张");
		JButton back = new JButton("上一张");
		box.add(Box.createHorizontalGlue());	//按钮左边自动间距
		box.add(back);	//添加按钮
		box.add(Box.createHorizontalStrut(20));	//两个按钮中间相距20像素
		box.add(next);	//添加按钮
		box.add(Box.createHorizontalGlue());	//按钮右边自动间距
		
		root.add(panel, BorderLayout.CENTER);	//图片显示在中间
		root.add(box, BorderLayout.PAGE_END);	//按钮显示在下方
		
		/**
		 * 下一张按钮监听事件
		 * */
		next.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e)
			{
				// TODO Auto-generated method stub
				NextImage();
			}
		});
		
		/**
		 * 上一张按钮监听事件
		 * */
		back.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e)
			{
				// TODO Auto-generated method stub
				BackImage();
			}
			
		});
	}
	/**
	 * 下一张
	 * */
	public void NextImage()
	{
		int index = panel.index;	//获得当前图片索引
		int size = panel.loadPath.length - 1;	//获得所有图片的数量,用于下面的算法。由于索引从0开始,所以这里-1
		if(index >= 0 && index < size)	//判断是否超出索引
		{
			panel.index += 1;	//索引+1,显示后面一张
		}
		else if(index == size)	//如果当前显示最后一张,则从第一张开始播放
		{
			panel.index = 0;	
		}
		panel.repaint();	//重新绘制图片
	}
	/**
	 * 上一张
	 * */
	public void BackImage()
	{
		int index = panel.index;
		int size = panel.loadPath.length - 1;
		if(index <= size && index > 0)
		{
			panel.index -= 1;	//索引-1,显示前面一张
		}	
		else if(index == 0)	//如果当前显示第一张,则显示最后一张图
		{
			panel.index = size;	
		}
		panel.repaint();
	}
}

程序入口:

import javax.swing.JFrame;

public class SwingDemo
{
	private static void createGUI()
	{
		// JFrame指一个窗口,构造方法的参数为窗口标题
		JFrame frame = new MyFrame("图片查看器");
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		// 设置窗口大小
		frame.setSize(600, 500);
		
		// 显示窗口
		frame.setVisible(true);
	}
	
	public static void main(String[] args)
	{
		// 此段代码间接地调用了 createGUI()
		javax.swing.SwingUtilities.invokeLater(new Runnable() {
			public void run()
			{
				createGUI();
			}
		});

	}
}

大功告成!可以查看文件夹中的图片了

源码下载:Java swing图片查看器