刚学到JavaSwing图片绘制,于是自己做了个简易的图片查看器小程序,在这里分享给大家,请多多指教。
话不多说先上部分图:
绘制图片需要自定义一个控件,我们这里写一个继承自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图片查看器