JavaSwing图片绘制,实现简单的图片查看器

刚学到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图片查看器

  • 11
    点赞
  • 68
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
要在Java Swing中为窗体添加背景图片,可以按照以下步骤进行操作: 1. 创建一个继承自JFrame的自定义窗体类。 2. 在该类的构造函数中设置窗体的标题、大小和关闭操作。 3. 创建一个继承自JPanel的自定义面板类,并重写其paintComponent方法来绘制背景图片。 4. 在自定义窗体类的构造函数中创建背景面板对象,并将其设置为窗体的内容面板。 下面是一个示例代码: ```java import java.awt.Dimension; import java.awt.Graphics; import java.awt.Image; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JPanel; public class BackgroundFrame extends JFrame { public BackgroundFrame() { setTitle("Background Image Demo"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); BackgroundPanel backgroundPanel = new BackgroundPanel(); setContentPane(backgroundPanel); pack(); setLocationRelativeTo(null); // 居中显示窗口 } public static void main(String[] args) { SwingUtilities.invokeLater(() -> { BackgroundFrame frame = new BackgroundFrame(); frame.setVisible(true); }); } private static class BackgroundPanel extends JPanel { private Image backgroundImage; public BackgroundPanel() { backgroundImage = new ImageIcon("path/to/your/image.jpg").getImage(); Dimension dimension = new Dimension(backgroundImage.getWidth(null), backgroundImage.getHeight(null)); setPreferredSize(dimension); } @Override protected void paintComponent(Graphics graphics) { super.paintComponent(graphics); graphics.drawImage(backgroundImage, 0, 0, null); } } } ``` 在上述代码中,将`path/to/your/image.jpg`替换为你自己的背景图片路径。然后运行`BackgroundFrame`类,就会显示带有背景图片的窗体。 希望这对你有所帮助!如果还有其他问题,请随时提问。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值