程序执行结果:

project结构图:

程序代码:

  1. import java.awt.BorderLayout;
  2. import java.awt.FileDialog;
  3. import java.awt.Graphics;
  4. import java.awt.Image;
  5. import java.awt.Toolkit;
  6. import java.awt.event.ActionEvent;
  7. import java.awt.event.ActionListener;
  8. import java.awt.event.KeyEvent;
  9. import java.awt.event.KeyListener;
  10. import java.awt.event.MouseEvent;
  11. import java.awt.event.MouseListener;
  12. import java.io.File;
  13. import java.util.ArrayList;
  14. import java.util.Iterator;
  15. import java.util.List;
  16.  
  17. import javax.swing.ImageIcon;
  18. import javax.swing.JButton;
  19. import javax.swing.JFrame;
  20. import javax.swing.JLabel;
  21. import javax.swing.JMenu;
  22. import javax.swing.JMenuBar;
  23. import javax.swing.JMenuItem;
  24. import javax.swing.JOptionPane;
  25. import javax.swing.JPanel;
  26. import javax.swing.JPopupMenu;
  27.  
  28. public class PictureViewer extends JFrame implements ActionListener,KeyListener {
  29.  
  30. /**
  31. * author Silocean
  32. */
  33. private static final long serialVersionUID = 7249010546054183791L;
  34. // 菜单条
  35. JMenuBar mb = new JMenuBar();
  36. // 文件菜单
  37. JMenu fileMenu = new JMenu("文件");
  38. // 打开文件菜单项
  39. JMenuItem openMenuItem = new JMenuItem("打开");
  40. // 退出程序菜单项
  41. JMenuItem exitMenuItem = new JMenuItem("退出");
  42. // 关于菜单
  43. JMenu aboutMenu = new JMenu("关于");
  44. // 关于菜单项
  45. JMenuItem aboutMenuItem = new JMenuItem("^(oo)^");
  46. // 上一张图片button
  47. JButton bLast = new JButton("上一张");
  48. // 图片数量标签
  49. JLabel lCount = new JLabel();
  50. // 下一张图片button
  51. JButton bNext = new JButton("下一张");
  52. // 显示图片的主面板
  53. MyPanel mp = new MyPanel();
  54. // 底部面板
  55. JPanel pSouth = new JPanel();
  56. // 右键菜单
  57. JPopupMenu pm = new JPopupMenu();
  58. // 删除图片菜单项
  59. JMenuItem deleteMenuItem = new JMenuItem("删除");
  60. // 图片属性菜单项
  61. JMenuItem propertyMenuItem = new JMenuItem("属性");
  62. // 文件对话框
  63. FileDialog dialog = new FileDialog(this, "打开文件", FileDialog.LOAD);
  64. // 默认工具包
  65. Toolkit tk = Toolkit.getDefaultToolkit();
  66. // 要显示的图片
  67. Image img = null;
  68. // 用于保存目录中全部图片
  69. File[] files = null;
  70. // 图片路径
  71. String fileDir = null;
  72. // 当前图片位置
  73. int indexOfNow = 0;
  74. // 存放图片格式个集合
  75. List<String> imgPatternList = new ArrayList<String>();
  76. // 存放图片路径的集合
  77. List<String> imgList = new ArrayList<String>();
  78. // 当前目录中全部图片的数量
  79. int amount = 0;
  80. // 自身的一个引用变量
  81. static PictureViewer pv = null;
  82.  
  83. /*
  84. * 构造方法初始化窗口
  85. */
  86. public PictureViewer() {
  87. this.setJMenuBar(mb);
  88. mb.add(fileMenu);
  89. fileMenu.add(openMenuItem);
  90. fileMenu.add(exitMenuItem);
  91. mb.add(aboutMenu);
  92. aboutMenu.add(aboutMenuItem);
  93. this.add(mp, BorderLayout.CENTER);
  94. this.add(pSouth, BorderLayout.SOUTH);
  95. lCount.setText("共" + amount + "张" + ",当前第" + indexOfNow + "张");
  96. pSouth.add(bLast);
  97. pSouth.add(lCount);
  98. pSouth.add(bNext);
  99. pm.add(deleteMenuItem);
  100. pm.add(propertyMenuItem);
  101. openMenuItem.addActionListener(this);
  102. exitMenuItem.addActionListener(this);
  103. aboutMenuItem.addActionListener(this);
  104. bLast.addActionListener(this);
  105. bNext.addActionListener(this);
  106. bLast.addKeyListener(this);
  107. bNext.addKeyListener(this);
  108. deleteMenuItem.addActionListener(this);
  109. propertyMenuItem.addActionListener(this);
  110. imgPatternList.add("JPG");
  111. imgPatternList.add("PNG");
  112. imgPatternList.add("GIF");
  113. /*imgPatternList.add("ICO");
  114. imgPatternList.add("BMP");
  115. imgPatternList.add("TIF");
  116. imgPatternList.add("PCX");
  117. imgPatternList.add("TGA");*/
  118. this.setSize(1000, 650);
  119. this.setTitle("照片查看器");
  120. this.setIconImage(tk.getImage(PictureViewer.class.getClassLoader().getResource("icon.png")));
  121. this.setLocationRelativeTo(null);
  122. this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  123. this.setVisible(true);
  124. }
  125.  
  126. @Override
  127. public void actionPerformed(ActionEvent e) {
  128. if(e.getSource() == openMenuItem) {
  129. // 打开文件
  130. this.openFile();
  131. } else if(e.getSource() == exitMenuItem) {
  132. // 退出程序
  133. this.exit();
  134. } else if(e.getSource() == aboutMenuItem) {
  135. // 显示关于程序对话框
  136. this.showAboutDialog();
  137. } else if(e.getSource() == bLast) {
  138. // 显示上一张图片
  139. this.lastImg();
  140. } else if(e.getSource() == bNext) {
  141. // 显示下一张图片
  142. this.nextImg();
  143. } else if(e.getSource() == deleteMenuItem) {
  144. // 删除图片
  145. this.deleteImg();
  146. } else if(e.getSource() == propertyMenuItem) {
  147. // 显示图片属性对话框
  148. this.showPropertyDialog();
  149. }
  150. }
  151.  
  152. /*
  153. * 推断该文件是否为图片
  154. */
  155. private boolean isImg(File f) {
  156. String postfix = f.toString().substring(f.toString().length()-3, f.toString().length());
  157. Iterator<String> it = imgPatternList.iterator();
  158. while(it.hasNext()) {
  159. String file = it.next();
  160. if(file.equalsIgnoreCase(postfix)) {
  161. return true;
  162. }
  163. }
  164. return false;
  165. }
  166.  
  167. /*
  168. * 打开文件
  169. */
  170. private void openFile() {
  171. dialog.setVisible(true);
  172. if(dialog.getFile() != null) {
  173. imgList.removeAll(imgList);
  174. fileDir = dialog.getDirectory();
  175. files = new File(fileDir).listFiles();
  176.  
  177. if(!this.isImg(new File(dialog.getFile()))) {
  178. JOptionPane.showMessageDialog(this, "不支持所选图片格式!请又一次选择");
  179. } else {
  180. img = tk.getImage(fileDir + dialog.getFile());
  181. }
  182.  
  183. // 把全部属于图片的放在一个集合里
  184. for(int i=0; i<files.length; i++) {
  185. if(files[i].isFile()) {
  186. if(this.isImg(files[i])) {
  187. //System.out.println(files[i]);
  188. imgList.add(files[i].toString());
  189. }
  190. }
  191. }
  192.  
  193. amount = imgList.size();
  194.  
  195. // 找出当前图片所在顺序位置
  196. for(int i=0; i<imgList.size(); i++) {
  197. if(imgList.get(i).equals(fileDir+dialog.getFile())) {
  198. indexOfNow = i;
  199. }
  200. }
  201.  
  202. }
  203. }
  204.  
  205. /*
  206. * 退出程序
  207. */
  208. private void exit() {
  209. System.exit(0);
  210. }
  211.  
  212. /*
  213. * 显示关于程序对话框
  214. */
  215. private void showAboutDialog() {
  216. JOptionPane.showMessageDialog(
  217. this,
  218. "一个简单的照片查看器" + "\n" + "by TracySilocean",
  219. "关于",
  220. JOptionPane.INFORMATION_MESSAGE,
  221. new ImageIcon(PictureViewer.class.getClassLoader().getResource(
  222. "0.gif")));
  223. }
  224.  
  225. /*
  226. * 显示上一张图片
  227. */
  228. private void lastImg() {
  229. if(dialog.getFile() != null) {
  230. if(indexOfNow<=0) {
  231. //JOptionPane.showMessageDialog(this, "已是第一张!");
  232. indexOfNow = imgList.size() - 1;
  233. } else {
  234. indexOfNow -= 1;
  235. }
  236. if(imgList.size() != 0) {
  237. img = tk.getImage(imgList.get(indexOfNow));
  238. }
  239. }
  240. }
  241.  
  242. /*
  243. * 显示下一张图片
  244. */
  245. private void nextImg() {
  246. if(dialog.getFile() != null) {
  247. if(indexOfNow>=imgList.size()-1) {
  248. //JOptionPane.showMessageDialog(this, "已是最后一张!");
  249. indexOfNow = 0;
  250. } else {
  251. indexOfNow += 1;
  252. }
  253. if(imgList.size() != 0) {
  254. img = tk.getImage(imgList.get(indexOfNow));
  255. }
  256. }
  257. }
  258.  
  259. /*
  260. * 删除图片
  261. */
  262. private void deleteImg() {
  263. int type = JOptionPane.showConfirmDialog(this, "确定要删除这张图片吗?", "删除文件", JOptionPane.YES_NO_OPTION);
  264. if(type == 0) {
  265. new File(imgList.get(indexOfNow)).delete();
  266. imgList.remove(indexOfNow);
  267. if(indexOfNow>=imgList.size()-1) {
  268. indexOfNow = 0;
  269. }
  270. img = tk.getImage(imgList.get(indexOfNow));
  271. } else if(type == 1) {
  272. // 不做不论什么处理
  273. }
  274. }
  275.  
  276. /*
  277. * 显示图片属性对话框
  278. */
  279. private void showPropertyDialog() {
  280. PropertyDialog propertyDialog = new PropertyDialog(this);
  281. propertyDialog.setVisible(true);
  282. }
  283.  
  284. public static void main(String[] args) {
  285. pv = new PictureViewer();
  286. }
  287.  
  288. /*
  289. * 显示图片的panel
  290. */
  291. private class MyPanel extends JPanel implements MouseListener {
  292.  
  293. public MyPanel() {
  294. this.addMouseListener(this);
  295. new Thread(new PaintThread()).start();
  296. }
  297.  
  298. @Override
  299. protected void paintComponent(Graphics g) {
  300. super.paintComponent(g);
  301. if(dialog.getFile() != null) {
  302. if(pv.isImg(new File(dialog.getFile()))) {
  303. pv.setTitle("照片查看器—" + new File(imgList.get(indexOfNow)).getName());
  304. }
  305. //g.drawString("正在载入……", 450, 270);
  306. lCount.setText("共" + amount + "张" + ",当前第" + (indexOfNow+1) + "张");
  307. int width = img.getWidth(null);
  308. int height = img.getHeight(null);
  309. int centerX = (mp.getWidth()-width)/2;
  310. int centerY = (mp.getHeight()-height)/2;
  311. double scale1 = (double)width/(double)height;
  312. double scale2 = (double)mp.getWidth()/(double)mp.getHeight();
  313. // 依据图片尺寸按需显示图片
  314. if(width>=mp.getWidth() && height<=mp.getHeight()) {
  315. g.drawImage(img, 0, (mp.getHeight()-(height*mp.getWidth()/width))/2, mp.getWidth(), height*mp.getWidth()/width, null);
  316. } else if(width<=mp.getWidth() && height>=mp.getHeight()) {
  317. g.drawImage(img, (mp.getWidth()-(width*mp.getHeight()/height))/2, 0, width*mp.getHeight()/height, mp.getHeight(), null);
  318. } else if(width>=mp.getWidth() && height>=mp.getHeight()) {
  319. if(scale1<scale2) {
  320. g.drawImage(img, (mp.getWidth()-(width*mp.getHeight()/height))/2, 0, width*mp.getHeight()/height, mp.getHeight(), null);
  321. } else {
  322. g.drawImage(img, 0, (mp.getHeight()-(height*mp.getWidth()/width))/2, mp.getWidth(), height*mp.getWidth()/width, null);
  323. }
  324. } else {
  325. g.drawImage(img, centerX, centerY, null);
  326. }
  327. } else {
  328. pv.setTitle("照片查看器");
  329. img = tk.getImage(PictureViewer.class.getClassLoader().getResource("bg.png"));
  330. g.drawImage(img, 0, 0, mp.getWidth(), mp.getHeight(), null);
  331. }
  332. }
  333.  
  334. /*
  335. * 不断刷新图片面板的线程
  336. */
  337. class PaintThread implements Runnable {
  338.  
  339. @Override
  340. public void run() {
  341. while(true) {
  342. repaint();
  343. try {
  344. Thread.sleep(20);
  345. } catch (InterruptedException e) {
  346. e.printStackTrace();
  347. }
  348. }
  349. }
  350.  
  351. }
  352.  
  353. @Override
  354. public void mouseReleased(MouseEvent e) {
  355. if(dialog.getFile() != null) {
  356. if(e.getButton() == MouseEvent.BUTTON3) {
  357. pm.show(e.getComponent(), e.getX(), e.getY());
  358. }
  359. }
  360. }
  361.  
  362. @Override
  363. public void mouseClicked(MouseEvent e) {
  364. // TODO Auto-generated method stub
  365.  
  366. }
  367.  
  368. @Override
  369. public void mousePressed(MouseEvent e) {
  370. // TODO Auto-generated method stub
  371.  
  372. }
  373.  
  374. @Override
  375. public void mouseEntered(MouseEvent e) {
  376. // TODO Auto-generated method stub
  377.  
  378. }
  379.  
  380. @Override
  381. public void mouseExited(MouseEvent e) {
  382. // TODO Auto-generated method stub
  383.  
  384. }
  385.  
  386. }
  387.  
  388. @Override
  389. public void keyPressed(KeyEvent e) {
  390. int key = e.getKeyCode();
  391. switch(key) {
  392. case KeyEvent.VK_UP:
  393. case KeyEvent.VK_LEFT:
  394. this.lastImg();
  395. break;
  396. case KeyEvent.VK_DOWN:
  397. case KeyEvent.VK_RIGHT:
  398. this.nextImg();
  399. break;
  400. }
  401.  
  402. }
  403.  
  404. @Override
  405. public void keyTyped(KeyEvent e) {
  406. // TODO Auto-generated method stub
  407.  
  408. }
  409.  
  410. @Override
  411. public void keyReleased(KeyEvent e) {
  412. // TODO Auto-generated method stub
  413.  
  414. }
  415.  
  416. }

  1. import java.awt.GridLayout;
  2. import java.io.File;
  3. import java.text.SimpleDateFormat;
  4. import java.util.Calendar;
  5. import java.util.Date;
  6.  
  7. import javax.swing.JDialog;
  8. import javax.swing.JLabel;
  9.  
  10. public class PropertyDialog extends JDialog {
  11.  
  12. PictureViewer mf = null;
  13.  
  14. JLabel lName = new JLabel("", JLabel.CENTER);
  15. JLabel lSize = new JLabel("", JLabel.CENTER);
  16. JLabel lLocation = new JLabel("", JLabel.CENTER);
  17. JLabel lLength = new JLabel("", JLabel.CENTER);
  18. JLabel lTime = new JLabel("", JLabel.CENTER);
  19.  
  20. File f = null;
  21.  
  22. public PropertyDialog(PictureViewer mf) {
  23. f = new File(mf.imgList.get(mf.indexOfNow));
  24. this.mf = mf;
  25. this.setLayout(new GridLayout(5, 1));
  26. this.add(lName);
  27. this.add(lSize);
  28. this.add(lLocation);
  29. this.add(lLength);
  30. this.add(lTime);
  31. lName.setText("名称:"+ f.getName());
  32. lSize.setText("图片尺寸:" + mf.img.getWidth(null) + "X" + mf.img.getHeight(null) + " 像素(宽X高)");
  33. lLocation.setText("位置:" + f.getAbsolutePath());
  34. lLength.setText("文件大小:" + f.length()/1024 + "KB");
  35. lTime.setText("改动时间:" + this.getTime());
  36. this.setBounds(500, 300, 400, 200);
  37. }
  38.  
  39. public String getTime() {
  40. Calendar c = Calendar.getInstance();
  41. long lastTime = f.lastModified();
  42. c.setTimeInMillis(lastTime);
  43. Date d = c.getTime();
  44. SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd hh:mm");
  45. return sdf.format(d);
  46. }
  47.  
  48. }

【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. windows phone 7 客户端和web的交互(WebBrowser的使用)

    原文:windows phone 7 客户端和web的交互(WebBrowser的使用) 前几天看到淘宝的Android客户端,有种促销的功能,当点击促销的时候连接的淘宝促销wap页面,然后点击商品后 ...

  2. session校验是否登录

    由于一个网站要有好多页面,如果每个页面都写上检验session是否为空,太麻烦了,所以写个工具类,就方便了. 1首先创建一个类库Common 2,然后在这个类库添加引用 3在Common继承 :Sys ...

  3. UltraEdit-32 温馨提示:右协会,取消 bak文件

    1.最近安装UltraEdit-32 无权协会,能够 高级 ->组态 ->文件关联 在 检查 继承到资源管理器 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkb ...

  4. Effective C++:规定20: 宁pass-by-reference-to-const更换pass-by-value

    (一) 假设传递参数当函数被调用pass-by-value,然后函数的参数是基于实际参数的副本最初值,调用,也得到该函数返回的结束值复印件. 请看下面的代码: class Person { publi ...

  5. VMware vSphere 服务器虚拟化之十八桌面虚拟化之安装View Composer服务器

                        VMware vSphere 服务器虚拟化之十八桌面虚拟化之安装View Composer服务器      View Compose服务可安装在管理虚拟机的vC ...

  6. 重新想象 Windows 8 Store Apps (19) - 动画: 线性动画, 关键帧动画, 缓动动画

    原文:重新想象 Windows 8 Store Apps (19) - 动画: 线性动画, 关键帧动画, 缓动动画 [源码下载] 重新想象 Windows 8 Store Apps (19) - 动画 ...

  7. UBUNTU12.04下安装配置体验gnome3

    年. ubuntu12.04默认采用unity界面,但是自己更加喜欢gnome3的操作方式. 安装gnome3: sudo apt-get install  gnome-shell 其实安装成功后,注 ...

  8. effective c++ 条款7 declare virtual destructor for polymophyc base class

    这似乎很明显. 如果base class的destructor不是virtual,当其derived class作为基类使用,析构的时候derived class的数据成员将不会被销毁. 举个例子 我 ...

  9. [WebGL入门]二十四,补色着色

    注:文章译自http://wgld.org/,原作者杉本雅広(doxas),文章中假设有我的额外说明,我会加上[lufy:],另外,鄙人webgl研究还不够深入,一些专业词语,假设翻译有误,欢迎大家指 ...

  10. iOS结合导航控制器和标签栏控制器

    <span style="font-family: Arial, Helvetica, sans-serif;"></span><pre name=& ...