【J2SE】java实现简单照片查看器
程序执行结果:
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实现简单照片查看器的更多相关文章
- jQuery 插件 Magnify 开发简介(仿 Windows 照片查看器)
前言 因为一些特殊的业务需求,经过一个多月的蛰伏及思考,我开发了这款 jQuery 图片查看器插件 Magnify,它实现了 Windows 照片查看器的所有功能,比如模态窗的拖拽.调整大小.最大化, ...
- jQuery 图片查看插件 Magnify 开发简介(仿 Windows 照片查看器)
前言 因为一些特殊的业务需求,经过一个多月的蛰伏及思考,我开发了这款 jQuery 图片查看器插件 Magnify,它实现了 Windows 照片查看器的所有功能,比如模态窗的拖拽.调整大小.最大化, ...
- win10图片打开方式里没有默认照片查看器的解决方法
今天安装好win10后发现打开图片的默认程序是win10自带的画图工具,非常不方便,并且右键选择打开方式里边也找不到默认的“照片查看器”.百度搜索了一下关于win10打开方式恢复默认照片查看器的方法, ...
- Win10系统怎样让打开图片方式为照片查看器
转载自:百度经验 http://jingyan.baidu.com/article/5d368d1ef0cad13f60c057e3.html 1.首先,我们需要使用注册表编辑器来开启Win10系统照 ...
- 在Windows 10下启用旧的照片查看器
从Windows 10开始,默认只能通过“照片”来查看图片了,非常不方便!通过将下列文本保存在.reg文件后导入,即可找回Windows XP时代的“照片查看器”. Windows Registry ...
- 解决Win10图片打开方式没有“Windows照片查看器”问题
1.打开注册表编辑器(Win+R,Regedit),定位至(建议修改前备份注册表): HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Photo Viewe ...
- Window Server 2012 R2 没有照片查看器 打开图片都是画板问题怎么解决
新安装了 Window Server 2012 R2 系统,感觉屌屌的样子,加上开机速度蛮快,心里略爽.结果,打开图片一看,发现竟然是画板,而且还没有照片查看器,顿时泪流满面. 后来我利用了强大的百度 ...
- 如何在Win10下设置图片的浏览方式为windows照片查看器
小编前些天刚装好了win10,一阵心奋啊,今天刚打开一个图片,却发现图片的默认打开方式是window应用商店的app, 这让我觉得特别不舒服,没有之前windows自带的照片查看器好用,后来我本想进入 ...
- Win10图片打开方式没有“Windows照片查看器”,如何找回?
如果你是全新安装的Win10正式版,那么就会发现当在图片上点击右键时,"打开方式"菜单里熟悉的"Windows照片查看器"不见了,换成了Win10全新的&quo ...
随机推荐
- c#为了实现自己的线程池功能(一)
线程池的技术背景 在面向对象编程中,创建和销毁对象是非常费时间的,由于创建一个对象要获取内存资源或者其他很多其他资源,所以提高服务程序效率的一个手段就是尽可能降低创建和销毁对象的次数.特别是一些非常耗 ...
- 样品GA的良好理解
遗传算法演示样本手册模拟 为了更好地理解遗传算法的计算过程,法的各 个主要运行步骤. 例:求下述二元函数的最大值: (1) 个体编码 遗传算法的运算对象是表示个体 ...
- POJ 1324 Holedox Moving 搜索
题目地址: http://poj.org/problem?id=1324 优先队列---A*的估价函数不能为蛇头到(1,1)的距离,这样会出错. 看了discuss,有大神说这题A*的估价函数为BFS ...
- Core 1.0中的管道-中间件模式
ASP.NET Core 1.0中的管道-中间件模式 SP.NET Core 1.0借鉴了Katana项目的管道设计(Pipeline).日志记录.用户认证.MVC等模块都以中间件(Middlewar ...
- Follow your hear(跟着心走)
端午三天的哈尔滨之旅已经over,非常开心真的非常开心.听了刘四风老师的"为爱开讲.我爱这世界"的论坛,尽管.这三天老师讲的不多.可是句句是精华.Follow your heart ...
- 用C设计,用C++编码
昨天晚上看到刘江的blog又补充了好几大段,今天早上又看到云风的人肉trackback,果然还是这种话题引人关注. 云风先是提了一下所谓C++带来的思想包袱(文言文曰“心智包袱”)问题,然 ...
- 重新想象 Windows 8 Store Apps (12) - 控件之 GridView 特性: 拖动项, 项尺寸可变, 分组显示
原文:重新想象 Windows 8 Store Apps (12) - 控件之 GridView 特性: 拖动项, 项尺寸可变, 分组显示 [源码下载] 重新想象 Windows 8 Store Ap ...
- 设置Windows 8.1屏幕自己主动旋转代码, Auto-rotate function code
程序代码实现启用或禁用Windows 8.1 Tablet的自己主动旋转功能 方法一:使用SetDisplayAutoRotationPreferences函数功能 #include <Wind ...
- C语言中的static 具体分析
google了近三页的关于C语言中static的内容,发现可用的信息非常少,要么长篇大论不知所云要么在关键之处几个字略过,对于想挖掘底层原理的刚開始学习的人来说參考性不是非常大.所以,我这篇博文博採众 ...
- Java Web整合开发(附录1) - 安装配置环境
1. Install JDK http://blog.csdn.net/sonnet123/article/details/9169741 Download JDK http://www.oracle ...