程序执行结果:

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. uvaLive5713 次小生成树

    uvaLive5713 修建道路使得n个点任意两点之间都可以连通,每个点有都有一定的人口,现在可以免费修一条道路, A是免费修的道路两端结点的人口之和, B的其它不是免费修道路的长度的总和 要求的是A ...

  2. WebKit介绍和总结(一)

    一 . WebKit 简单介绍 Webkit 是一个开放源码的浏览器引擎 (web browser engine) ,最初的代码来自 KDE 的 KHTML 和 KJS( 均开放源码 ) . 苹果公司 ...

  3. android studio下gradle与Git错误解决方法

    Error: Gradle: Execution failed for task ':mytask' > A problem occurred starting process 'command ...

  4. Docker创建支持ssh服务的容器和镜像

    原文链接:Docker创建支持ssh服务的容器和镜像 1. 这里使用的centos作为容器,所以首先下载centos的images # sudo docker pull centos 2. 下载后执行 ...

  5. Google Maps Android API v2 (1)- 入门

    才可以开始工作的API,你将需要下载的API,并确保你有一个谷歌地图Android的API V2关键.API和关键是免费提供的. 概观 获得谷歌地图Android的API V2 谷歌地图API密钥 显 ...

  6. simpleDateFormat日期格式转换

    1------------------------------------------------------------------------------------- package com.n ...

  7. 【原创】leetCodeOj ---Convert Sorted List to Binary Search Tree 解题报告

    原题地址: https://oj.leetcode.com/problems/convert-sorted-list-to-binary-search-tree/ 题目内容: Given a sing ...

  8. bootstarp modal自己主动调整宽度的JS代码

    $('#ajaxPage').modal('show').css({ width: 'auto', 'margin-left': function () { return -($(this).widt ...

  9. android下调试声卡驱动之概述

    在Android中音频系统使用的是ALSA系统架构.ASoC--ALSA System on Chip .是建立在标准ALSA驱动层上,为了更好地支持 嵌入式处理器和移动设备中的音频Codec的一套软 ...

  10. Dom操作高级应用

    table tBodies,tHead,tFoot,rows,cells 一个table有多个tbody oTab.tBodies[0].rows[i].style.background = &quo ...