程序执行结果:

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. TextBox自定义Mac输入框类

    using System.Windows.Controls; namespace test { public class MacTextBox : TextBox { private string _ ...

  2. 超炫HTML5 SVG聊天框拖拽弹性摇摆动画特效

    这是一款很有创意的HTML5 SVG聊天框拖拽弹性摇摆动画特效. 用户能够用鼠标点击或用手滑动聊天框上的指定区域,该区域会以很有弹性的弹簧效果拉开聊天用户列表.点击一个用户头像后.又以同样的弹性特效切 ...

  3. ACM/ICPM2014鞍山现场赛D Galaxy (HDU 5073)

    题目链接:pid=5073">http://acm.hdu.edu.cn/showproblem.php?pid=5073 题意:给定一条线上的点,然后能够去掉当中的m个,使剩下的到重 ...

  4. twitter 监测登陆活动

    http://vicenteaguileradiaz.com/download/tinfoleak/tinfoleak-1.2.tar.gz

  5. Windows Server 架设VPN要点

    PPTP 为给客户端连接的VPN用户帐户设置“允许拨入”属性. VPN服务端与客户端都无需安装任何证书. L2TP/IPSEC VPN服务器与客户端分别需要在自己的“本地计算机帐户>个人”(而非 ...

  6. RedGate 工具SQLMultiScript1.1

    原文:RedGate 工具SQLMultiScript1.1 RedGate 工具SQLMultiScript1.1 SQLMultiScript是一个脚本分发工具,当你写好了一个SQL脚本之后,你需 ...

  7. 用数据说话,外贸产品选择(中篇)-google趋势分析法

    在上篇文章<用数据说话,贸B2C产品选择(上篇)-热门搜索法>中我们能搜索出来几种产品了,那我们就拿上次搜索出来的热门产品来做一个趋势分析.我们经过几个站点挑出了几种热卖产品Wedding ...

  8. Hdu 5256 系列转换

    主题链接: HDU5236 代码: #include<iostream> #include<cstdio> #include<cstring> #include&l ...

  9. php:修改NetBeans默认字体

    在Netbeans中由于使用了Swing进行开发,所以其中界面的字体也是由Java虚拟机进行配置而不是随操作系统的.在安装完Netbeans后默认的字体大小是11px.而在Windows下的宋体最小支 ...

  10. 11gR2更换OCR和VOTE

    11gR2开始,OCR和VOTE它们被存储在ASM磁盘组,因此,更换OCR有两种方法,第一是使用ASM磁盘组drop disk数据重组后,另一种方法是OCR迁移到另一个磁盘组 第一种:add disk ...