程序执行结果:

project结构图:

程序代码:

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)^");// 上一张图片button  JButton bLast = new JButton("上一张");// 图片数量标签JLabel lCount = new JLabel();// 下一张图片buttonJButton 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);}@Overridepublic 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();}@Overrideprotected 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 {@Overridepublic void run() {while(true) {repaint();try {Thread.sleep(20);} catch (InterruptedException e) {e.printStackTrace();}}}}@Overridepublic void mouseReleased(MouseEvent e) {if(dialog.getFile() != null) {if(e.getButton() == MouseEvent.BUTTON3) {pm.show(e.getComponent(), e.getX(), e.getY());}}}@Overridepublic void mouseClicked(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mousePressed(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseEntered(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseExited(MouseEvent e) {// TODO Auto-generated method stub}}@Overridepublic 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;}}@Overridepublic void keyTyped(KeyEvent e) {// TODO Auto-generated method stub}@Overridepublic 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实现简单照片查看器相关推荐

  1. java图片查看器下载_java照片查看器源代码

    java照片查看器源代码 package ioStream;import java.awt.AWTEvent;import java.awt.Color;import java.awt.Graphic ...

  2. 一个简单的window照片查看器

    调试一下午,可以对了,这是一个照片查看器的雏形 图片的路径可以更改,图片的名字为1.jpg 2.jpg等,也 可以随时更改! Code: import java.awt.BorderLayout; i ...

  3. 制作一个简单的照片查看器(支持缩放手势)

    本文主要实现的功能是制作一个照片查看器,点击照片能进入大图模式,支持左右滑动,支持手势缩放, 本文只演示1张图和3张图的效果,其他的效果分为为: 2张图的时候按照1行2列展示, 3张图的时候按照1行3 ...

  4. java图片识别查看器模拟_[转载]windows照片查看器无法显示图片内存不足

    问题描述 最近在使用Windows照片查看器打开一个jpg文件的时候异常 Windows照片查看器无法显示此图片,因为计算机上的可用内存可能不足.请关闭一些目前没有使用的程序或者释放部分硬盘空间(如果 ...

  5. windows照片查看器无法显示此图片_Real3d PhotoViewer下载-照片查看器 v1.2.2 官方版...

    Real3d Photo Viewer是一款简单易用的照片查看器,旨在帮助您打开与查看jpg.jpeg.jpe.bmp.tif.tiff.pgm.pbm.ppm.ras.sr等多种照片文件,而且提供了 ...

  6. win10照片查看器_图片打开方式中找不到Windows图片查看器怎么办

    如何在电脑中使用默认的windows图片查看器来打开图片进行查看的?有时我们可能无法找到Windows图片查看器工具,接下来小编就与大家分享,一种简单的利用windows图片查看器查看图片的具体方法. ...

  7. win10商店打不开_win10自带的照片查看器打不开的修复方法

    我们知道win10或win7等系统都自带有默认的照片查看器,安装好系统后,我们再不用安装第三方看图软件来查看照片了,给我们玩电脑带来了极大的方便. 但有些朋友近来向我求教照片查看器打不开,或打开很慢不 ...

  8. win10照片查看器_win10系统,图片查看器不见了咋办?教你调出传统图片查看器。...

    点击上方"高效黑科技软件"→点击右上角" ... "→选"设为星标★" 大家好,我是小黑. 最近比较忙,没有打理公众号,今天说啥也要更一篇, ...

  9. 基于STM32的照片查看器课程报告

    注:资料借鉴正点原子正点精英板STM32F1开发指南(库函数版):程序是正点精英板STM32F1实验四十三章图片显示实验. 程序地址:实验38图片显示实验.7z-嵌入式文档类资源-CSDN下载 目录 ...

最新文章

  1. 关于base target=_self 等
  2. Debug.startMethodTracing() 没有生成trace文件
  3. 王彪20162321 2016-2017-2 《程序设计与数据结构》第7周学习总结
  4. 【Python数据预处理】 归一化(按列减均值,除方差),标准化(按列缩放到指定范围),正则化(范数)
  5. 【渝粤教育】国家开放大学2018年秋季 0239-21T电子商务物流管理 参考试题
  6. 信息学奥赛一本通 1122:计算鞍点 | OpenJudge NOI 1.8 05:计算鞍点
  7. codevs 3287 货车运输 NOIP2013提高组
  8. 设计模式之单例模式的多重实现
  9. Python之进程+线程+协程(并发与并行、GIL锁、同步锁、死锁、递归锁)
  10. java物流管理系统代码_Java物流配送管理系统 Spring 源码下载
  11. FFmpeg安装及将rtsp流转hls协议流通过nginx进行视频直播
  12. navicat+for+mysql10.0.11简体中文破解版
  13. keras图像风格迁移
  14. 关于秒杀的细节,了解多少
  15. 宏碁电脑BIOS没有usb启动项怎么办?
  16. 物联网技术技术架构以及物联网应用领域的介绍
  17. 迷你西游最新服务器是哪个,迷你西游公测新开服务器“万佛朝宗”公告
  18. 神器推荐:应用之星,零代码就能制作炫酷的H5页面
  19. linux kvm切换器,PS2系列KVM切换器
  20. 1905 杨辉三角

热门文章

  1. mysql主从延迟时间是多少_MySQL主从延迟
  2. angular 多个片段拼接_教你怎么用手机制作和拼接短视频?
  3. 力扣605 种花问题(C++,附思路)
  4. live linux 密码,Linux_如何使你的Linux系统省略输入用户名密码,在做Livecd的时候总是要输入用 - phpStudy...
  5. 微信内打开的网页不能下载APP,微信无法打开浏览器访问指定页面的解决方案...
  6. CodeForces 468 CHack it!
  7. 【加密算法】Base64
  8. 推荐JVM的9款编程语言杀手开发利器
  9. 昨日购买了华为U8800+。晒联通2.2版系统与官方2.3版系统的评测跑分。
  10. 【转载】正则表达式30分钟入门教程