zoukankan      html  css  js  c++  java
  • 【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,
    				"一个简单的照片查看器" + "
    " + "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);
    	}
    	
    }
    


  • 相关阅读:
    APP 元素定位总结(未完待补充)
    vue-axios常见请求配置和全局设置
    vue-axios发送并发请求
    vue-axios基本使用
    vue-vuex-store目录结构
    vue-vuex-modules的基本使用
    vue-vuex-actions的基本使用
    vue-vuex-mutations的类型常量
    vue-vuex-state响应式
    vue-vuex-mutation的提交风格
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/4469461.html
Copyright © 2011-2022 走看看