【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 ...
随机推荐
- windows phone 7 客户端和web的交互(WebBrowser的使用)
原文:windows phone 7 客户端和web的交互(WebBrowser的使用) 前几天看到淘宝的Android客户端,有种促销的功能,当点击促销的时候连接的淘宝促销wap页面,然后点击商品后 ...
- session校验是否登录
由于一个网站要有好多页面,如果每个页面都写上检验session是否为空,太麻烦了,所以写个工具类,就方便了. 1首先创建一个类库Common 2,然后在这个类库添加引用 3在Common继承 :Sys ...
- UltraEdit-32 温馨提示:右协会,取消 bak文件
1.最近安装UltraEdit-32 无权协会,能够 高级 ->组态 ->文件关联 在 检查 继承到资源管理器 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkb ...
- Effective C++:规定20: 宁pass-by-reference-to-const更换pass-by-value
(一) 假设传递参数当函数被调用pass-by-value,然后函数的参数是基于实际参数的副本最初值,调用,也得到该函数返回的结束值复印件. 请看下面的代码: class Person { publi ...
- VMware vSphere 服务器虚拟化之十八桌面虚拟化之安装View Composer服务器
VMware vSphere 服务器虚拟化之十八桌面虚拟化之安装View Composer服务器 View Compose服务可安装在管理虚拟机的vC ...
- 重新想象 Windows 8 Store Apps (19) - 动画: 线性动画, 关键帧动画, 缓动动画
原文:重新想象 Windows 8 Store Apps (19) - 动画: 线性动画, 关键帧动画, 缓动动画 [源码下载] 重新想象 Windows 8 Store Apps (19) - 动画 ...
- UBUNTU12.04下安装配置体验gnome3
年. ubuntu12.04默认采用unity界面,但是自己更加喜欢gnome3的操作方式. 安装gnome3: sudo apt-get install gnome-shell 其实安装成功后,注 ...
- effective c++ 条款7 declare virtual destructor for polymophyc base class
这似乎很明显. 如果base class的destructor不是virtual,当其derived class作为基类使用,析构的时候derived class的数据成员将不会被销毁. 举个例子 我 ...
- [WebGL入门]二十四,补色着色
注:文章译自http://wgld.org/,原作者杉本雅広(doxas),文章中假设有我的额外说明,我会加上[lufy:],另外,鄙人webgl研究还不够深入,一些专业词语,假设翻译有误,欢迎大家指 ...
- iOS结合导航控制器和标签栏控制器
<span style="font-family: Arial, Helvetica, sans-serif;"></span><pre name=& ...