文档章节

Java 简易电子相册(一)

o
 osc_2y1ylz6c
发布于 07/07 17:15
字数 1128
阅读 16
收藏 0

行业解决方案、产品招募中!想赚钱就来传!>>>

一、前言

如图所示:
在这里插入图片描述
目前代码实现了文件夹读取,缩略图展示这两个功能,剩余功能大家看界面也能猜到了,有生之年系列吧,下次想写再说吧。

二、准备

1.win10

2.eclipse

在这里插入图片描述

3.jdk 1.8.0_221

在这里插入图片描述

4.jar

在这里插入图片描述
下载链接:https://search.maven.org/artifact/net.coobird/thumbnailator/0.4.8/jar

三、结构

在这里插入图片描述
其中日志模块还没有写。

四、代码

1、启动main

package imageView.lyrics.main;

import java.awt.EventQueue;

import imageView.lyrics.ui.ImageViewFrameUI;

public class Main {
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					new ImageViewFrameUI();
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}
}

2、service

package imageView.lyrics.service;

import java.io.File;
import java.util.ArrayList;
import java.util.Locale;

import javax.swing.JFileChooser;
import javax.swing.filechooser.FileNameExtensionFilter;
import javax.swing.filechooser.FileSystemView;
import javax.swing.tree.DefaultMutableTreeNode;

import imageView.lyrics.ui.AlbumTreeUI;
import imageView.lyrics.ui.ImageUI;
import imageView.lyrics.util.ResizeImage;

public class AlbumService {
	enum ImageType{
		jpg,jpeg,png,CR2
	}
	private AlbumTreeUI albumTreeUI = AlbumTreeUI.getInstance(); 
	private ImageUI imageUI = ImageUI.getInstance();

	private String browseFolder() {
		// 拿到文件系统
		FileSystemView fsv = FileSystemView.getFileSystemView();
		// 设置过滤器
		FileNameExtensionFilter fileNameExtensionFilter = new FileNameExtensionFilter("Image File","jpg","jpeg","png");
		// 修改为英文 
		JFileChooser.setDefaultLocale(Locale.US);
		// 实例化
		JFileChooser fileChooser = new JFileChooser();
		// 设置当前工作目录为桌面
		fileChooser.setCurrentDirectory(fsv.getHomeDirectory());
		// 设置标头
		fileChooser.setDialogTitle("select");
		// 设置文件选择类型
		fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
		// 移除所有文件过滤模式
		fileChooser.removeChoosableFileFilter(fileChooser.getAcceptAllFileFilter());
		// 添加文件过滤
		fileChooser.setFileFilter(fileNameExtensionFilter);
		// 拿到操作结果
		int result = fileChooser.showOpenDialog(null);
		// 判断操作结果
		if(result == JFileChooser.APPROVE_OPTION) {
			// 打印所选文件路径
			return fileChooser.getSelectedFile().toString();
		}
		return null;
	}
	private void ergodicImage(String path,ArrayList<String> list) {
		DefaultMutableTreeNode parent = albumTreeUI.addAlbum(path);
		File file = new File(path);
		File[] tempList = file.listFiles();
	    for (int i = 0; i < tempList.length; i++) {
	    	String temp = tempList[i].toString();
	        if (tempList[i].isFile() && isImage(temp)) {
	        	albumTreeUI.addImage(parent, temp);
	        	String outPath = "thumbnail\\"+temp.substring(temp.lastIndexOf("\\")+1, temp.lastIndexOf("."))+"Temp.jpg";
	        	ResizeImage.generateFixedSizeImage(temp, outPath);
	        	imageUI.addImage(outPath);
	        }
	        if (tempList[i].isDirectory()) {
	        	ergodicImage(tempList[i].getAbsolutePath(),list);
	        }
	    }
	}
	private boolean isImage(String name) {
		String suffix = name.substring(name.lastIndexOf(".")+1);
		for(ImageType type:ImageType.values()) {
			if(suffix.equalsIgnoreCase(type.toString())) {
				return true;
			}
		}
		return false;
		
	}
	public boolean openFolder() {
		String path = browseFolder();
		if(path==null|| path.isEmpty()) {
			return false;
		}
		ArrayList<String> arrayList = new ArrayList<String>();
		ergodicImage(path,arrayList);
		return true;
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub

	}

}

3、界面

AlbumTreeUI

package imageView.lyrics.ui;

import javax.swing.JPanel;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.util.HashMap;
import java.util.Map;
import javax.swing.JScrollPane;

public class AlbumTreeUI extends JPanel {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private DefaultMutableTreeNode root;
	public JTree tree;
	private Map<DefaultMutableTreeNode,String> map = new HashMap<>();
	private static final AlbumTreeUI instance = new AlbumTreeUI();
	public Map<DefaultMutableTreeNode,String> getMap() {
		return map;
	}

	public static AlbumTreeUI getInstance() {
		return instance;
	}

	/**
	 * Create the panel.
	 */
	private AlbumTreeUI() {
		root = new DefaultMutableTreeNode("Album");
		DefaultTreeModel model = new DefaultTreeModel(root);
		setLayout(new BorderLayout(0, 0));
		
		JPanel panel = new JPanel();
		add(panel, BorderLayout.CENTER);
		panel.setLayout(new BorderLayout(0, 0));
		
		JScrollPane scrollPane = new JScrollPane();
		panel.add(scrollPane);
		panel.setPreferredSize(new Dimension(80,520));
		tree = new JTree();
		scrollPane.setViewportView(tree);
		tree.setModel(model);
	}
	public DefaultMutableTreeNode addAlbum(String path) {
		 String name = path.substring(path.lastIndexOf("\\"));
		 DefaultMutableTreeNode parent = new DefaultMutableTreeNode(name);
		 root.add(parent);
		 return parent;
	}
	public void addImage(DefaultMutableTreeNode parent, String path) {
		DefaultMutableTreeNode defaultMutableTreeNode = new DefaultMutableTreeNode(path.substring(path.lastIndexOf("\\")+1));
		getMap().put(defaultMutableTreeNode, path);
		parent.add(defaultMutableTreeNode);
	}
	public void deleteImage() {
		 DefaultMutableTreeNode selectNode = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent();
	     if ((selectNode == null) || (selectNode.isRoot())) {
	         return;
	     }
	     DefaultTreeModel model = (DefaultTreeModel) tree.getModel();
	     model.removeNodeFromParent(selectNode);
	     tree.repaint();
	}
	public String openImage() {
		DefaultMutableTreeNode selectNode = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent();
	     if ((selectNode == null) || (selectNode.isRoot())) {
	         return null;
	     }
	     String path = map.get(selectNode);
	     return path;
	}

}

ImageDispalyUI

package imageView.lyrics.ui;

import javax.swing.JPanel;
import java.awt.BorderLayout;
import javax.swing.ImageIcon;
import javax.swing.JButton;

public class ImageDispalyUI extends JPanel {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	public JButton btnNewButton;
	private ImageIcon imageIcon;

	/**
	 * Create the panel.
	 */
	public ImageDispalyUI(String imagePath) {
		imageIcon = new ImageIcon(imagePath);
		setSize(imageIcon.getIconWidth(),imageIcon.getIconHeight());
		setLayout(new BorderLayout(0, 0));
		btnNewButton = new JButton("");
		btnNewButton.setIcon(imageIcon);
		add(btnNewButton);
	}
	public ImageIcon getImageIcon() {
		return imageIcon;
	}

}

ImageUI

package imageView.lyrics.ui;

import java.awt.Dimension;

import javax.swing.JPanel;

public class ImageUI extends JPanel {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private static final ImageUI instance = new ImageUI();
	private int positionX = 5;
	private int positionY = 5;

	
	public static ImageUI getInstance() {
		return instance;
	}
	/**
	 * Create the panel.
	 */
	private ImageUI() {
		setLayout(null);
	}

	public void addImage(String path) {
		ImageDispalyUI imageDispalyUI = new ImageDispalyUI(path);
		int width = this.getWidth()-80;
		int height = this.getHeight()-80; 
		int imageWidth = imageDispalyUI.getWidth();
		int imageHeight = imageDispalyUI.getHeight();
		imageDispalyUI.setBounds(positionX, positionY, imageWidth,imageHeight);
		int x = imageWidth+positionX;
		int y = imageHeight+positionY;
		if(x<width && y<height) {
			positionX += imageWidth+5;
		}
		if(x>width && y<height) {
			positionX = 5;
			positionY += imageHeight+5;
		}
		if(x>width && y>height) {
			positionY += imageHeight;
			this.setPreferredSize(new Dimension(positionX,positionY));
		}
		this.add(imageDispalyUI);
		this.updateUI();
	}
}

ImageViewFrameUI

package imageView.lyrics.ui;

import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JFrame;
import javax.swing.JMenuBar;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import java.awt.BorderLayout;
import java.awt.Dimension;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;

import imageView.lyrics.service.AlbumService;

public class ImageViewFrameUI {

	private JFrame frame;
	private JMenuItem mntmOpenfolder;
	private AlbumService albumService = new AlbumService();
    private AlbumTreeUI albumTreeUI = AlbumTreeUI.getInstance();

	/**
	 * Create the application.
	 */
	public ImageViewFrameUI() {
		initialize();
		addListener();
		leftPanelListener();
	}

	/**
	 * Initialize the contents of the frame.
	 */
	private void initialize() {
		frame = new JFrame();
		frame.setVisible(true);
		frame.setTitle("Image View");
		frame.setBounds(100, 100, 800, 600);
		frame.setLocationRelativeTo(null);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		JMenuBar menuBar = new JMenuBar();
		frame.setJMenuBar(menuBar);
		
		JMenu mnFile = new JMenu("File");
		menuBar.add(mnFile);
		
		JMenuItem mntmOpenFile = new JMenuItem("open file");
		mnFile.add(mntmOpenFile);
		
		mntmOpenfolder = new JMenuItem("open folder");
		mnFile.add(mntmOpenfolder);
		
		JMenu mnEdit = new JMenu("Edit");
		menuBar.add(mnEdit);
		
		JMenuItem mntmAdd = new JMenuItem("add");
		mnEdit.add(mntmAdd);
		
		JMenuItem mntmModify = new JMenuItem("modify");
		mnEdit.add(mntmModify);
		
		JMenuItem mntmRemove = new JMenuItem("remove");
		mnEdit.add(mntmRemove);
		
		JMenu mnView = new JMenu("View");
		menuBar.add(mnView);
		
		JMenuItem mntmFind = new JMenuItem("find");
		mnView.add(mntmFind);
		
		JMenu mnHelp = new JMenu("Help");
		menuBar.add(mnHelp);
		
		JMenuItem mntmAbout = new JMenuItem("About");
		mnHelp.add(mntmAbout);
		frame.getContentPane().setLayout(new BorderLayout(0, 0));
		
		JScrollPane scrollPane = new JScrollPane();
		frame.getContentPane().add(scrollPane);
		JPanel panel = new JPanel();
		scrollPane.setViewportView(panel);
		panel.setPreferredSize(new Dimension(760,520));
		panel.setLayout(new BorderLayout(0, 0));
		
		JSplitPane splitPane = new JSplitPane();
		splitPane.setOneTouchExpandable(true);
		splitPane.setResizeWeight(0.2);
		panel.add(splitPane);
		AlbumTreeUI albumTreeUI = AlbumTreeUI.getInstance(); 
		splitPane.setLeftComponent(albumTreeUI);
		ImageUI imageUI = ImageUI.getInstance();
		splitPane.setRightComponent(imageUI);
	}
	
	private void addListener() {
		mntmOpenfolder.addActionListener(event -> {
			albumService.openFolder();
		});
		
	}
	private void leftPanelListener() {
		MouseAdapter mouseAdapter = new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				String imagePath = albumTreeUI.openImage();	
				System.out.println(imagePath);
			}
		}; 
		albumTreeUI.tree.addMouseListener(mouseAdapter);
	}
}

4.util

package imageView.lyrics.util;

import net.coobird.thumbnailator.Thumbnails;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

/**

 */
public class ResizeImage {
    public static void main(String[] args) {
		ResizeImage.generateFixedSizeImage("D:\\download\\毕业图片\\IMG_3303.CR2","thumbnail\\3.jpg");
    }

    /**
     * 使用给定的图片生成指定大小的图片
     */
    public static String generateFixedSizeImage(String inputPath,String outputPath){
        try {
        	InputStream inputStream = new FileInputStream(inputPath);
            Thumbnails.of(inputStream).size(80,80).toFile(outputPath);
            return outputPath;
        } catch (IOException e) {
            System.out.println("原因: " + e.getMessage());
        }
		return "";
    }
}

五、效果

初始界面
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述




六、晚安

困了困了,晚安,代码写的不好,大家多多包涵

o
粉丝 0
博文 58
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
Flappy Bird(安卓版)逆向分析(一)

更改每过一关的增长分数 反编译的步骤就不介绍了,我们直接来看反编译得到的文件夹 方法1:在smali目录下,我们看到org/andengine/,可以知晓游戏是由andengine引擎开发的。打开/res/raw/at...

enimey
2014/03/04
5.9K
18
程序猿媛一:Android滑动翻页+区域点击事件

滑动翻页+区域点击事件 ViewPager+GrideView 声明:博文为原创,文章内容为,效果展示,思路阐述,及代码片段。文尾附注源码获取途径。 转载请保留原文出处“http://my.oschina.net/gluoyer...

花佟林雨月
2013/11/09
4.1K
1
研究虚拟机--Jikes RVM

Jikes研究虚拟机(Jikes Research Virtual Machine,简称Jikes RVM)是一种成熟的用于执行Java程序的虚拟机,其早期版本与当前版本分别在通用公共许可证(CPL)与Eclipse公共许可证(EPL)下开...

匿名
2013/02/13
1.1K
0
Swing界面分析和调试工具--Swing Inspector

Swing Inspector是一个Java Swing/AWT用户界面分析和调试工具,功能与firebug类似,具有强大的Swing/AWT用户界面分析和调试相关功能。 适用于从java swing初级到高级的所有开发人员,能够快速...

匿名
2013/03/06
3.3K
0
Java™ 编译器--Janino

Janino是一个超级小但又超级快的Java™ 编译器. 它不仅能像javac工具那样讲一组源文件编译成字节码文件,还可以对一些Java表达式,代码块,类中的文本(class body)或者内存中源文件进行编译,...

匿名
2013/04/02
4.1K
0

没有更多内容

加载失败,请刷新页面

加载更多

MySql大表分页(附独门秘技)

问题背景 MySql(InnoDB)中的订单表需要按时间顺序分页查询,且主键不是时间维度递增,订单表在百万以上规模,此时如何高效地实现该需求? 注:本文并非主要讲解如何建立索引,以下的分析均建...

osc_8kei32r9
11分钟前
0
0
css中使用变量

2017年3月,微软宣布 Edge 浏览器将支持 CSS 变量。 这个重要的 CSS 新功能,所有主要浏览器已经都支持了。 声明css变量的时候,变量名前面要加两根连词线(--)。 变量名大小写敏感,--hea...

osc_mpdswsal
12分钟前
0
0
WAS 忘记密码

一、重置密码 1.首先关闭was,ps –ef|grep java 查看java进程号,然后kill -9 XXXX杀掉进程即可。或者使用命令./stopServer.sh server1 2.取消控制台安全验证 方法一:/opt/IBM/WebSphere/...

osc_1i3ltp99
13分钟前
0
0
npm install的--save选项是什么? - What is the --save option for npm install?

问题: I saw some tutorial where the command was: 我看到了一些命令所在的教程: npm install --save What does the --save option mean? --save选项是什么意思? Not able to find the......

fyin1314
14分钟前
0
0
C#使用读写锁三行代码简单解决多线程并发写入文件时线程同步的问题

在开发程序的过程中,难免少不了写入错误日志这个关键功能。实现这个功能,可以选择使用第三方日志插件,也可以选择使用数据库,还可以自己写个简单的方法把错误信息记录到日志文件。 选择最...

osc_7cws6vmd
15分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部