【J2SE】java实现简单照片查看器

程序运行结果:

工程结构图:

程序代码:

import java.awt.BorderLayout;
import java.awt.FileDialog;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.File;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;

public class PictureViewer extends JFrame implements ActionListener,KeyListener {

	/**
	 * author Silocean
	 */
	private static final long serialVersionUID = 7249010546054183791L;
	// 菜单栏
	JMenuBar mb = new JMenuBar();
	// 文件菜单
	JMenu fileMenu = new JMenu("文件");
	// 打开文件菜单项
	JMenuItem openMenuItem = new JMenuItem("打开");
	// 退出程序菜单项
	JMenuItem exitMenuItem = new JMenuItem("退出");
	// 关于菜单
	JMenu aboutMenu = new JMenu("关于");
	// 关于菜单项
	JMenuItem aboutMenuItem = new JMenuItem("^(oo)^");
	// 上一张图片按钮
	JButton bLast = new JButton("上一张");
	// 图片数量标签
	JLabel lCount = new JLabel();
	// 下一张图片按钮
	JButton bNext = new JButton("下一张");
	// 显示图片的主面板
	MyPanel mp = new MyPanel();
	// 底部面板
	JPanel pSouth = new JPanel();
	// 右键菜单
	JPopupMenu pm = new JPopupMenu();
	// 删除图片菜单项
	JMenuItem deleteMenuItem = new JMenuItem("删除");
	// 图片属性菜单项
	JMenuItem propertyMenuItem = new JMenuItem("属性");
	// 文件对话框
	FileDialog dialog = new FileDialog(this, "打开文件", FileDialog.LOAD);
	// 默认工具包
	Toolkit tk = Toolkit.getDefaultToolkit();
	// 要显示的图片
	Image img = null;
	// 用于保存文件夹中所有图片
	File[] files = null;
	// 图片路径
	String fileDir = null;
	// 当前图片位置
	int indexOfNow = 0;
	// 存放图片格式个集合
	List<String> imgPatternList = new ArrayList<String>();
	// 存放图片路径的集合
	List<String> imgList = new ArrayList<String>();
	// 当前文件夹中所有图片的数量
	int amount = 0;
	// 自身的一个引用变量
	static PictureViewer pv = null;

	/*
	 * 构造方法初始化窗体
	 */
	public PictureViewer() {
		this.setJMenuBar(mb);
		mb.add(fileMenu);
		fileMenu.add(openMenuItem);
		fileMenu.add(exitMenuItem);
		mb.add(aboutMenu);
		aboutMenu.add(aboutMenuItem);
		this.add(mp, BorderLayout.CENTER);
		this.add(pSouth, BorderLayout.SOUTH);
		lCount.setText("共" + amount + "张" + ",当前第" + indexOfNow + "张");
		pSouth.add(bLast);
		pSouth.add(lCount);
		pSouth.add(bNext);
		pm.add(deleteMenuItem);
		pm.add(propertyMenuItem);
		openMenuItem.addActionListener(this);
		exitMenuItem.addActionListener(this);
		aboutMenuItem.addActionListener(this);
		bLast.addActionListener(this);
		bNext.addActionListener(this);
		bLast.addKeyListener(this);
		bNext.addKeyListener(this);
		deleteMenuItem.addActionListener(this);
		propertyMenuItem.addActionListener(this);
		imgPatternList.add("JPG");
		imgPatternList.add("PNG");
		imgPatternList.add("GIF");
		/*imgPatternList.add("ICO");
		imgPatternList.add("BMP");
		imgPatternList.add("TIF");
		imgPatternList.add("PCX");
		imgPatternList.add("TGA");*/
		this.setSize(1000, 650);
		this.setTitle("照片查看器");
		this.setIconImage(tk.getImage(PictureViewer.class.getClassLoader().getResource("icon.png")));
		this.setLocationRelativeTo(null);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setVisible(true);
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		if(e.getSource() == openMenuItem) {
			// 打开文件
			this.openFile();
		} else if(e.getSource() == exitMenuItem) {
			// 退出程序
			this.exit();
		} else if(e.getSource() == aboutMenuItem) {
			// 显示关于程序对话框
			this.showAboutDialog();
		} else if(e.getSource() == bLast) {
			// 显示上一张图片
			this.lastImg();
		} else if(e.getSource() == bNext) {
			// 显示下一张图片
			this.nextImg();
		} else if(e.getSource() == deleteMenuItem) {
			// 删除图片
			this.deleteImg();
		} else if(e.getSource() == propertyMenuItem) {
			// 显示图片属性对话框
			this.showPropertyDialog();
		}
	}

	/*
	 * 判断该文件是否为图片
	 */
	private boolean isImg(File f) {
		String postfix = f.toString().substring(f.toString().length()-3, f.toString().length());
		Iterator<String> it = imgPatternList.iterator();
		while(it.hasNext()) {
			String file = it.next();
			if(file.equalsIgnoreCase(postfix)) {
				return true;
			}
		}
		return false;
	}

	/*
	 * 打开文件
	 */
	private void openFile() {
		dialog.setVisible(true);
		if(dialog.getFile() != null) {
			imgList.removeAll(imgList);
			fileDir = dialog.getDirectory();
			files = new File(fileDir).listFiles();

			if(!this.isImg(new File(dialog.getFile()))) {
				JOptionPane.showMessageDialog(this, "不支持所选图片格式!请重新选择");
			} else {
				img = tk.getImage(fileDir + dialog.getFile());
			}

			// 把所有属于图片的放在一个集合里
			for(int i=0; i<files.length; i++) {
				if(files[i].isFile()) {
					if(this.isImg(files[i])) {
						//System.out.println(files[i]);
						imgList.add(files[i].toString());
					}
				}
			}

			amount = imgList.size();

			// 找出当前图片所在顺序位置
			for(int i=0; i<imgList.size(); i++) {
				if(imgList.get(i).equals(fileDir+dialog.getFile())) {
					indexOfNow = i;
				}
			}

		}
	}

	/*
	 * 退出程序
	 */
	private void exit() {
		System.exit(0);
	}

	/*
	 * 显示关于程序对话框
	 */
	private void showAboutDialog() {
		JOptionPane.showMessageDialog(
				this,
				"一个简单的照片查看器" + "\n" + "by TracySilocean",
				"关于",
				JOptionPane.INFORMATION_MESSAGE,
				new ImageIcon(PictureViewer.class.getClassLoader().getResource(
						"0.gif")));
	}

	/*
	 * 显示上一张图片
	 */
	private void lastImg() {
		if(dialog.getFile() != null) {
			if(indexOfNow<=0) {
				//JOptionPane.showMessageDialog(this, "已是第一张!");
				indexOfNow = imgList.size() - 1;
			} else {
				indexOfNow -= 1;
			}
			if(imgList.size() != 0) {
				img = tk.getImage(imgList.get(indexOfNow));
			}
		}
	}

	/*
	 * 显示下一张图片
	 */
	private void nextImg() {
		if(dialog.getFile() != null) {
			if(indexOfNow>=imgList.size()-1) {
				//JOptionPane.showMessageDialog(this, "已是最后一张!");
				indexOfNow = 0;
			} else {
				indexOfNow += 1;
			}
			if(imgList.size() != 0) {
				img = tk.getImage(imgList.get(indexOfNow));
			}
		}
	}

	/*
	 * 删除图片
	 */
	private void deleteImg() {
		int type = JOptionPane.showConfirmDialog(this, "确定要删除这张图片吗?", "删除文件", JOptionPane.YES_NO_OPTION);
		if(type == 0) {
			new File(imgList.get(indexOfNow)).delete();
			imgList.remove(indexOfNow);
			if(indexOfNow>=imgList.size()-1) {
				indexOfNow = 0;
			}
			img = tk.getImage(imgList.get(indexOfNow));
		} else if(type == 1) {
			// 不做任何处理
		}
	}

	/*
	 * 显示图片属性对话框
	 */
	private void showPropertyDialog() {
		PropertyDialog propertyDialog = new PropertyDialog(this);
		propertyDialog.setVisible(true);
	}

	public static void main(String[] args) {
		pv = new PictureViewer();
	}

	/*
	 * 显示图片的panel
	 */
	private class MyPanel extends JPanel implements MouseListener {

		public MyPanel() {
			this.addMouseListener(this);
			new Thread(new PaintThread()).start();
		}

		@Override
		protected void paintComponent(Graphics g) {
			super.paintComponent(g);
			if(dialog.getFile() != null) {
				if(pv.isImg(new File(dialog.getFile()))) {
					pv.setTitle("照片查看器—" + new File(imgList.get(indexOfNow)).getName());
				}
				//g.drawString("正在加载……", 450, 270);
				lCount.setText("共" + amount + "张" + ",当前第" + (indexOfNow+1) + "张");
				int width = img.getWidth(null);
				int height = img.getHeight(null);
				int centerX = (mp.getWidth()-width)/2;
				int centerY = (mp.getHeight()-height)/2;
				double scale1 = (double)width/(double)height;
				double scale2 = (double)mp.getWidth()/(double)mp.getHeight();
				// 根据图片尺寸按需显示图片
				if(width>=mp.getWidth() && height<=mp.getHeight()) {
					g.drawImage(img, 0, (mp.getHeight()-(height*mp.getWidth()/width))/2, mp.getWidth(), height*mp.getWidth()/width, null);
				} else if(width<=mp.getWidth() && height>=mp.getHeight()) {
					g.drawImage(img, (mp.getWidth()-(width*mp.getHeight()/height))/2, 0, width*mp.getHeight()/height, mp.getHeight(), null);
				} else if(width>=mp.getWidth() && height>=mp.getHeight()) {
					if(scale1<scale2) {
						g.drawImage(img, (mp.getWidth()-(width*mp.getHeight()/height))/2, 0, width*mp.getHeight()/height, mp.getHeight(), null);
					} else {
						g.drawImage(img, 0, (mp.getHeight()-(height*mp.getWidth()/width))/2, mp.getWidth(), height*mp.getWidth()/width, null);
					}
				} else {
					g.drawImage(img, centerX, centerY, null);
				}
			} else {
				pv.setTitle("照片查看器");
				img = tk.getImage(PictureViewer.class.getClassLoader().getResource("bg.png"));
				g.drawImage(img, 0, 0, mp.getWidth(), mp.getHeight(), null);
			}
		}

		/*
		 * 不断刷新图片面板的线程
		 */
		class PaintThread implements Runnable {

			@Override
			public void run() {
				while(true) {
					repaint();
					try {
						Thread.sleep(20);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
			}

		}

		@Override
		public void mouseReleased(MouseEvent e) {
			if(dialog.getFile() != null) {
				if(e.getButton() == MouseEvent.BUTTON3) {
					pm.show(e.getComponent(), e.getX(), e.getY());
				}
			}
		}

		@Override
		public void mouseClicked(MouseEvent e) {
			// TODO Auto-generated method stub

		}

		@Override
		public void mousePressed(MouseEvent e) {
			// TODO Auto-generated method stub

		}

		@Override
		public void mouseEntered(MouseEvent e) {
			// TODO Auto-generated method stub

		}

		@Override
		public void mouseExited(MouseEvent e) {
			// TODO Auto-generated method stub

		}

	}

	@Override
	public void keyPressed(KeyEvent e) {
		int key = e.getKeyCode();
		switch(key) {
		case KeyEvent.VK_UP:
		case KeyEvent.VK_LEFT:
			this.lastImg();
			break;
		case KeyEvent.VK_DOWN:
		case KeyEvent.VK_RIGHT:
			this.nextImg();
			break;
		}

	}

	@Override
	public void keyTyped(KeyEvent e) {
		// TODO Auto-generated method stub

	}

	@Override
	public void keyReleased(KeyEvent e) {
		// TODO Auto-generated method stub

	}

}
import java.awt.GridLayout;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

import javax.swing.JDialog;
import javax.swing.JLabel;

public class PropertyDialog extends JDialog {

	PictureViewer mf = null;

	JLabel lName = new JLabel("", JLabel.CENTER);
	JLabel lSize = new JLabel("", JLabel.CENTER);
	JLabel lLocation = new JLabel("", JLabel.CENTER);
	JLabel lLength = new JLabel("", JLabel.CENTER);
	JLabel lTime = new JLabel("", JLabel.CENTER);

	File f = null;

	public PropertyDialog(PictureViewer mf) {
		f = new File(mf.imgList.get(mf.indexOfNow));
		this.mf = mf;
		this.setLayout(new GridLayout(5, 1));
		this.add(lName);
		this.add(lSize);
		this.add(lLocation);
		this.add(lLength);
		this.add(lTime);
		lName.setText("名称:"+ f.getName());
		lSize.setText("图片尺寸:" + mf.img.getWidth(null) + "X" + mf.img.getHeight(null) + " 像素(宽X高)");
		lLocation.setText("位置:" + f.getAbsolutePath());
		lLength.setText("文件大小:" + f.length()/1024 + "KB");
		lTime.setText("修改时间:" + this.getTime());
		this.setBounds(500, 300, 400, 200);
	}

	public String getTime() {
		Calendar c = Calendar.getInstance();
		long lastTime = f.lastModified();
		c.setTimeInMillis(lastTime);
		Date d = c.getTime();
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd hh:mm");
		return sdf.format(d);
	}

}

【J2SE】java实现简单照片查看器

时间: 2024-11-05 20:39:14

【J2SE】java实现简单照片查看器的相关文章

Java Log Viewer日志查看器

工欲善其事必先利其器 在投奔怒海--一个Domino老程序员眼里的Java开发我提到目前所做的Java开发中遇到的大量日志之问题.服务器控制台刷屏似地滚动,日志文件飞快地增长,debug的时候相关信息常常被例常日志淹没,在众多Logger滔滔不绝的输出下,要找出错误所在有时都挺费眼.日志的作用无可置疑,大型项目中日志海量产生也不少见.在以前的Domino开发中,Domino服务器在产生日志方面相当节制,程序员对日志的依赖程度也不高.转换到Java开发,我用一直最喜爱的文本编辑器EditPlus肉

win10图片打开方式里没有默认照片查看器的解决方法

今天安装好win10后发现打开图片的默认程序是win10自带的画图工具,非常不方便,并且右键选择打开方式里边也找不到默认的“照片查看器”.百度搜索了一下关于win10打开方式恢复默认照片查看器的方法,虽然有用但非常繁琐.下面电脑配置网为大家总结了3种解决win10图片打开方式恢复为默认照片查看器的方法.(推荐使用第一种,简单易用) Win10怎么把图片打开方式恢复默认照片查看器方法一: 新建一个TXT文本文档,把以下代码复制粘贴到其中: Windows Registry Editor Versi

Win10图片打开方式没有“Windows照片查看器”,如何找回?

如果你是全新安装的Win10正式版,那么就会发现当在图片上点击右键时,“打开方式”菜单里熟悉的“Windows照片查看器”不见了,换成了Win10全新的“照片”应用.而如果你是从Win7/Win8.1升级到的Win10系统,“Windows照片查看器”则会被保留.下面就来分享一下如何找回Win10图片打开方式中的“Windows照片查看器”选项: 首先,打开注册表编辑器(1.Win10打开注册表编辑器的方法), Win10打开注册表编辑器的方法 方法一:运行“regedit”命令打开注册表编辑器

解决Win10图片打开方式没有“Windows照片查看器”问题

1.打开注册表编辑器(Win+R,Regedit),定位至(建议修改前备份注册表): HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Photo Viewer\Capabilities\FileAssociations 2.在右侧窗口中点击右键,选择"新建 – 字符串值",然后把新建的字符串值重命名为 .jpg ,数值数据设置为 PhotoViewer.FileAssoc.Tiff:然后按同样的方法新建名为 .jpeg  .png  .gif

Window Server 2012 R2 没有照片查看器 打开图片都是画板问题怎么解决

新安装了 Window Server 2012 R2 系统,感觉屌屌的样子,加上开机速度蛮快,心里略爽.结果,打开图片一看,发现竟然是画板,而且还没有照片查看器,顿时泪流满面. 后来我利用了强大的百度,最后妥妥的解决了. 步骤如下: 1.按住win键(也就是键盘左下角的那朵花),打开[服务器管理器]. 2.点击[添加角色和功能] (ps:如果没看到,就打开右上角的[视图]点击[显示欢迎磁贴], 一般都会显示的) 3.在打开的界面中,点击下一步直到左侧[功能]栏,然后在右侧功能中找到[用户界面和基

Delphi7 调用 Windows 照片查看器打印对话框

Delphi7 调用 Windows 照片查看器打印对话框. uses ShellAPI; var strPictureFilePath: string; begin ShellExecute(Handle, 'print', PChar(strPictureFilePath), nil, nil, SW_SHOW); end;

Win10系统怎样让打开图片方式为照片查看器

转载自:百度经验 http://jingyan.baidu.com/article/5d368d1ef0cad13f60c057e3.html 1.首先,我们需要使用注册表编辑器来开启Win10系统照片查看器功能,因为其实这个功能是被隐藏了,那么按下Windows徽标键+R键,打开运行命令窗口,输入“regedit”命令. 2.打开注册表编辑器之后,我们双击左侧的目录,依次打开HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft目录 3.找到Windows Photo Vi

如何在Win10下设置图片的浏览方式为windows照片查看器

小编前些天刚装好了win10,一阵心奋啊,今天刚打开一个图片,却发现图片的默认打开方式是window应用商店的app, 这让我觉得特别不舒服,没有之前windows自带的照片查看器好用,后来我本想进入打开方式进行更改,却发现里面竟然没有照片查看器,这让我顿时无语. So 我自己写了一个有关照片查看器的注册表(下载地址:http://pan.baidu.com/s/1gdD8fOf),双击全部添加进去后,可以发现 一下子觉得舒服多了,还是用这个windows照片查看器更好,不知大家有没有同感

Windows 10恢复“照片查看器”为默认图片查看器

参考资料 https://msdn.microsoft.com/en-us/library/windows/desktop/dd758090(v=vs.85).aspx http://www.xitonghe.com/jiaocheng/Windows10-2681.html 1. 编辑注册表 Windows 10的照片查看器仅保留对tiff文件的默认支持,需要编辑注册表来支持png/jpg等文件 打开HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows P