程序执行结果:

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();
// 下一张图片button
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实现简单照片查看器的更多相关文章

  1. jQuery 插件 Magnify 开发简介(仿 Windows 照片查看器)

    前言 因为一些特殊的业务需求,经过一个多月的蛰伏及思考,我开发了这款 jQuery 图片查看器插件 Magnify,它实现了 Windows 照片查看器的所有功能,比如模态窗的拖拽.调整大小.最大化, ...

  2. jQuery 图片查看插件 Magnify 开发简介(仿 Windows 照片查看器)

    前言 因为一些特殊的业务需求,经过一个多月的蛰伏及思考,我开发了这款 jQuery 图片查看器插件 Magnify,它实现了 Windows 照片查看器的所有功能,比如模态窗的拖拽.调整大小.最大化, ...

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

    今天安装好win10后发现打开图片的默认程序是win10自带的画图工具,非常不方便,并且右键选择打开方式里边也找不到默认的“照片查看器”.百度搜索了一下关于win10打开方式恢复默认照片查看器的方法, ...

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

    转载自:百度经验 http://jingyan.baidu.com/article/5d368d1ef0cad13f60c057e3.html 1.首先,我们需要使用注册表编辑器来开启Win10系统照 ...

  5. 在Windows 10下启用旧的照片查看器

    从Windows 10开始,默认只能通过“照片”来查看图片了,非常不方便!通过将下列文本保存在.reg文件后导入,即可找回Windows XP时代的“照片查看器”. Windows Registry ...

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

    1.打开注册表编辑器(Win+R,Regedit),定位至(建议修改前备份注册表): HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Photo Viewe ...

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

    新安装了 Window Server 2012 R2 系统,感觉屌屌的样子,加上开机速度蛮快,心里略爽.结果,打开图片一看,发现竟然是画板,而且还没有照片查看器,顿时泪流满面. 后来我利用了强大的百度 ...

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

    小编前些天刚装好了win10,一阵心奋啊,今天刚打开一个图片,却发现图片的默认打开方式是window应用商店的app, 这让我觉得特别不舒服,没有之前windows自带的照片查看器好用,后来我本想进入 ...

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

    如果你是全新安装的Win10正式版,那么就会发现当在图片上点击右键时,"打开方式"菜单里熟悉的"Windows照片查看器"不见了,换成了Win10全新的&quo ...

随机推荐

  1. 安装pygame

    pygame的安装 我们首先要去到:http://www.pygame.org/download.shtml 下载我们所需要的软件包: 我选择的是:pygame-1.9.2a0.win32-py3.2 ...

  2. windows使用nginx+memcached实现负载均衡和session或者缓存共享

    windows使用nginx+memcached实现负载均衡和session或者缓存共享 两台server server1:115.29.186.215 windows2008 64位操作系统 ser ...

  3. 初识缓存以及ehcache初体验

    1.缓存的意义 缓存机制就是将数据库中经常使用的数据取出放入内存中.程序调用时直接从内存中取,丌用每次使用  数据都訪问数据库,这样提高了效率. 2.缓存须要关注的问题 1)  缓存的更新 缓存中的数 ...

  4. Windows Phone开发(38):动画之PointAnimation

    原文:Windows Phone开发(38):动画之PointAnimation PointAnimation也是很简单的,与前面说到的两个Animation是差不多的,属性也是一样的,如By.Fro ...

  5. Windows Phone开发(14):数据模板

    原文:Windows Phone开发(14):数据模板 数据模板,如果你仅仅听到这个名词,你一定很迷惑,什么来的?用来干什么的?不急,亲,今天,我们一起来探索一下吧. 用白话文说,数据模板就是用来规范 ...

  6. oracle错误之 ora-01017

    ora-01017 现象描述: scott用户和其它建立的用户,都登的上.但sys和system用户登录不上 方案一(试过,不行): 1,打开目录:F:\app\Administrator\produ ...

  7. 发布Ubuntu/Linux系统cache,增加可用内存空间

    桌面Ubuntu总内存4G,但free只有内存有100M 重视top命令检查看到真正的能力free内存.以下是真正的内存使用情况的看法有一个命令. watch -n 1 cat /proc/memin ...

  8. BeagleBone Black 板第三课:Debian7.5系统安装和远程控制BBB板

    BBB板第三课:Debian7.5系统安装和远程控制BBB板 由于BBB板系统是Debian 7.4.据说使用Debian系统能够实现非常多BBB板的无缝连接.能够更好的学习和控制BBB板,所以就决定 ...

  9. A WPF File ListView and ComboBox

    源码下载: Download FileListView_Version_2.zip Download FileListView_Version_2_Binaries.zip Download File ...

  10. VC档(夹)文件夹路径的经营方针和代码

    ***********************************************声明*************************************************** ...