程序执行结果:

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. 潜水 java类加载器ClassLoader

    类加载器(class loader)用于装载 Java 类到 Java 虚拟机中.一般来说.Java 虚拟机使用 Java 类的方式例如以下:Java 源程序(.java 文件)在经过 Java 编译 ...

  2. Google Protocol Buffers和java字符串处理控制

    大多数的操作码被从夜晚复制.懒得敲. 直接在源代码和测试结果如下. serabuffer.proto档.使用下面的命令来生成java代码. protoc -I=./ --java_out=./ ser ...

  3. Tuxedo入门学�

    中间件介绍: 介于客户机和server之间的夹层,突破了传统的c/s架构,为构建大规模,高性能,分布式c/s应用程序提供了通信,事物,安全,容错等基础服务,屏蔽了底层应用细节,应用程序不必从底层开发, ...

  4. 【我的书】Unity Shader的书 — 文件夹(2015.12.21更新)

    写在前面 感谢全部点进来看的朋友.没错.我眼下打算写一本关于Unity Shader的书. 出书的目的有以下几个: 总结我接触Unity Shader以来的历程,给其它人一个借鉴.我非常明确学Shad ...

  5. Android 混淆proguard的实现(图文)

    1.  在Eclipse中的project编译执行后,在文件夹bin以下有生成一些文件,当中classes.dex是未经过混淆生成的.而我们要混淆的话,就要又一次生成一个混淆过的classes.dex ...

  6. 【Android笔记】MediaPlayer基本用法

    Android MediaPlayer基本使用方式 使用MediaPlayer播放音频或者视频的最简单样例: JAVA代码部分: public class MediaPlayerStudy exten ...

  7. 【Web探索之旅】第四部分:Web程序员

    内容简介 1.第四部分第一课:什么是Web程序员? 2.第四部分第二课:如何成为Web程序员? 3.第四部分第三课:成为优秀Web程序员的秘诀 第四部分:Web程序员(完结篇) 大家好.终于来到了[W ...

  8. J Dp

    <span style="color:#000099;">/* ____________________________________________________ ...

  9. UVa 572 Oil Deposits(DFS)

     Oil Deposits  The GeoSurvComp geologic survey company is responsible for detecting underground oil ...

  10. Swift学习资料

    http://www.hangge.com/blog/cache/category_72_1.html