zoukankan      html  css  js  c++  java
  • 第十二周学习总结

    简单"本地图片读取应用":
    源代码:

    
    package javaswingexercise;
    
    import java.awt.*;
    import java.awt.event.*;
    import java.beans.*;
    import java.io.*;
    import java.net.*;
    
    import javax.swing.*;
    import javax.swing.event.*;
    import javax.swing.tree.*;
    
    public class EazyApp extends JFrame {
    
    	/**
    	 * 
    	 */
    	private static final long serialVersionUID = 1L;
    
    	private JTree tree;
    
    	private JDesktopPane desktopPane;
    
    	private JLabel iconLabel;
    
    	private JButton pButton;
    
    	private JButton nButton;
    
    	private JScrollPane iconScrollPane;
    
    	private JPanel iconPanel;
    
    	int imgIndex;
    
    	int imgCount;
    
    	/**
    	 * Launch the application
    	 * 
    	 * @param args
    	 */
    	public static void main(String args[]) {
    		try {
    			EazyApp frame = new EazyApp();
    			frame.setVisible(true);
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    	}
    
    	/**
    	 * Create the frame
    	 */
    	public EazyApp() {
    		super();
    		setResizable(false);
    		setBounds(0, 0, 1024, 768);
    		setExtendedState(EazyApp.MAXIMIZED_BOTH);
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
    		final JSplitPane splitPane = new JSplitPane();
    		splitPane.setDividerLocation(220);
    		getContentPane().add(splitPane, BorderLayout.CENTER);
    
    		final JScrollPane treeSscrollPane = new JScrollPane();
    		splitPane.setLeftComponent(treeSscrollPane);
    
    		DefaultMutableTreeNode root = new DefaultMutableTreeNode("");
    
    		File[] files = File.listRoots();// 遍历系统根目录
    		for (int i = 0; i < files.length; i++) {
    			File file = files[i];// 获得跟目录对象
    			DefaultMutableTreeNode node = null;
    			try {
    				node = new DefaultMutableTreeNode(file.getCanonicalPath());
    			} catch (IOException e) {
    				e.printStackTrace();
    			}
    			File[] files2 = file.listFiles(fileFilter);// 遍历二级子目录
    			if (files2 != null) {
    				for (int j = 0; j < files2.length; j++) {
    					File file2 = files2[j];// 获得二级子目录对象
    					if (file2.isDirectory())
    						node.add(new DefaultMutableTreeNode(file2.getName()));
    					else
    						node.add(new DefaultMutableTreeNode(file2.getName(),
    								false));
    				}
    			}
    			root.add(node);
    		}
    
    		tree = new JTree(root, true);
    		tree.setRootVisible(false);
    		tree.addTreeWillExpandListener(new TreeWillExpandListener() {
    			public void treeWillExpand(TreeExpansionEvent e)
    					throws ExpandVetoException {
    				TreePath willExpandPath = e.getPath();
    				loadChildNode(willExpandPath);// 加载子目录
    			}
    
    			public void treeWillCollapse(TreeExpansionEvent e)
    					throws ExpandVetoException {
    			}
    		});
    		tree.addTreeSelectionListener(new TreeSelectionListener() {
    			public void valueChanged(TreeSelectionEvent e) {
    				TreePath selectionPath = tree.getSelectionPath();
    				loadChildNode(selectionPath);// 加载子目录
    				//
    				iconPanel.removeAll();
    				Object[] nodePath = selectionPath.getPath();
    				String selectedDir = nodePath[1].toString().replace("\", "/");
    				for (int i = 2; i < nodePath.length; i++) {
    					selectedDir = selectedDir + nodePath[i] + "/";
    				}
    				DefaultMutableTreeNode node = (DefaultMutableTreeNode) selectionPath
    						.getLastPathComponent();
    				if (node.getAllowsChildren()) {
    					new LoadIconInThread(selectedDir, node).start();
    				} else {
    					if (pButton.isEnabled())
    						pButton.setEnabled(false);
    					if (nButton.isEnabled())
    						nButton.setEnabled(false);
    					showImgInFrame(selectedDir);
    				}
    				SwingUtilities.updateComponentTreeUI(iconPanel);
    			}
    		});
    		treeSscrollPane.setViewportView(tree);
    
    		final JPanel panel = new JPanel();
    		panel.setLayout(new BorderLayout());
    		splitPane.setRightComponent(panel);
    
    		desktopPane = new JDesktopPane();
    		JLabel backLabel = new JLabel(); // 创建一个标签组件对象
    		try {
    			URL resource = new File("D:\Temp\mr\bj.png").toURI().toURL();
    			ImageIcon icon = new ImageIcon(resource); // 创建背景图片对象
    			backLabel.setIcon(icon); // 令标签组件显示背景图片
    			backLabel.setBounds(0, 0, icon.getIconWidth(), icon.getIconHeight()); // 设置组件的显示位置及大小
    		} catch (MalformedURLException e1) {
    			e1.printStackTrace();
    		} // 获得背景图片的路径
    		
    		desktopPane.add(backLabel, new Integer(Integer.MIN_VALUE)); // 将标签组件添加到指定索引位置
    		panel.add(desktopPane, BorderLayout.CENTER);
    
    		final JPanel operatePanel = new JPanel();
    		operatePanel.setLayout(new BorderLayout());
    		operatePanel.setPreferredSize(new Dimension(0, 150));
    		panel.add(operatePanel, BorderLayout.SOUTH);
    
    		pButton = new JButton();
    		pButton.setText("<<");
    		pButton.setEnabled(false);
    		pButton.addActionListener(new ActionListener() {
    			public void actionPerformed(ActionEvent e) {
    				imgIndex--;
    				JButton button = (JButton) iconPanel.getComponent(imgIndex);
    				showImgInFrame(button.getName());
    				if (imgIndex == 0)
    					pButton.setEnabled(false);
    				if (!nButton.isEnabled()) {
    					if (imgIndex < imgCount - 1)
    						nButton.setEnabled(true);
    				}
    				button.requestFocus();
    			}
    		});
    		operatePanel.add(pButton, BorderLayout.WEST);
    
    		nButton = new JButton();
    		nButton.setText(">>");
    		nButton.setEnabled(false);
    		nButton.addActionListener(new ActionListener() {
    			public void actionPerformed(ActionEvent e) {
    				imgIndex++;
    				JButton button = (JButton) iconPanel.getComponent(imgIndex);
    				showImgInFrame(button.getName());
    				if (!pButton.isEnabled()) {
    					if (imgIndex > 0)
    						pButton.setEnabled(true);
    				}
    				if (imgIndex == imgCount - 1)
    					nButton.setEnabled(false);
    				button.requestFocus();
    			}
    		});
    		operatePanel.add(nButton, BorderLayout.EAST);
    
    		iconScrollPane = new JScrollPane();
    		iconScrollPane
    				.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER);
    		operatePanel.add(iconScrollPane, BorderLayout.CENTER);
    
    		iconPanel = new JPanel();
    		iconScrollPane.setViewportView(iconPanel);
    		//
    	}
    
    	FileFilter fileFilter = new FileFilter() {
    		public boolean accept(File file) {
    			if (file.isDirectory())
    				return true;
    			else {
    				String name = file.getName().toUpperCase();
    				if (name.endsWith(".JPG"))
    					return true;
    				else if (name.endsWith(".GIF"))
    					return true;
    				else
    					return false;
    			}
    		}
    	};
    
    	private class PreviewButtonAL implements ActionListener {
    		public void actionPerformed(ActionEvent e) {
    			showImgInFrame(((JButton) e.getSource()).getName());
    		}
    	}
    
    	public void showImgInFrame(String imgDir) {
    		JInternalFrame frame = desktopPane.getSelectedFrame();
    		String imgName = new File(imgDir).getName();
    		JInternalFrame[] allFrames = desktopPane.getAllFrames();
    		for (int i = 0; i < allFrames.length; i++) {
    			JInternalFrame internalFrame = allFrames[i];
    			if (internalFrame.getTitle().equals(imgName)) {
    				if (internalFrame.isIcon()) {
    					try {
    						internalFrame.setIcon(false);
    					} catch (PropertyVetoException e) {
    						e.printStackTrace();
    					}
    				}
    				if (!internalFrame.isSelected()) {
    					try {
    						internalFrame.setSelected(true);
    					} catch (PropertyVetoException e) {
    						e.printStackTrace();
    					}
    				}
    				frame = internalFrame;
    				break;
    			}
    		}
    
    		if (frame == null || frame.isIcon()) {
    			frame = new JInternalFrame();
    			frame.setIconifiable(true);
    			frame.setMaximizable(true);
    			frame.setBounds(-5, -5, 800, 600);
    			desktopPane.add(frame);
    			frame.setVisible(true);
    			iconLabel = new JLabel();
    			frame.getContentPane().add(iconLabel);
    		}
    		if (!frame.getTitle().equals(imgName)) {
    			frame.setTitle(imgName);
    			iconLabel.setIcon(new ImageIcon(imgDir));
    		}
    	}
    
    	public void loadChildNode(TreePath path) {
    		DefaultMutableTreeNode node = (DefaultMutableTreeNode) path
    				.getLastPathComponent();
    		if (node.getAllowsChildren() && node.getChildCount() == 0) {
    			StringBuffer dirBuffer = new StringBuffer();
    			Object[] nodes = path.getPath();
    			for (int i = 0; i < nodes.length; i++) {
    				dirBuffer.append(nodes[i]);
    				dirBuffer.append("\");
    			}
    			File file = new File(dirBuffer.toString());
    			File[] files = file.listFiles(fileFilter);
    			for (int i = 0; i < files.length; i++) {
    				File file2 = files[i];
    				if (file2.isDirectory())
    					node.add(new DefaultMutableTreeNode(file2.getName()));
    				else
    					node
    							.add(new DefaultMutableTreeNode(file2.getName(),
    									false));
    			}
    		}
    	}
    
    	private class LoadIconInThread extends Thread {
    
    		private String selectedDir;
    
    		private DefaultMutableTreeNode node;
    
    		public LoadIconInThread(String selectedDir, DefaultMutableTreeNode node) {
    			this.node = node;
    			this.selectedDir = selectedDir;
    		}
    
    		@Override
    		public void run() {
    			imgIndex = -1;
    			imgCount = 0;
    			pButton.setEnabled(false);
    			nButton.setEnabled(false);
    			int childCount = node.getChildCount();
    			for (int i = 0; i < childCount; i++) {
    				DefaultMutableTreeNode childNode = (DefaultMutableTreeNode) node
    						.getChildAt(i);
    				if (!childNode.getAllowsChildren()) {
    					imgCount++;
    					String imgName = childNode.toString();
    					MButton button = new MButton();
    					button.setText(imgName);
    					button.setName(selectedDir + imgName);
    					button.setPreferredSize(new Dimension(120, 120));
    					button.addActionListener(new PreviewButtonAL());
    					iconPanel.add(button);
    					iconScrollPane.validate();
    					if (!nButton.isEnabled()) {
    						if (imgCount > 0)
    							nButton.setEnabled(true);
    					}
    					try {
    						Thread.sleep(200);
    					} catch (InterruptedException e) {
    						e.printStackTrace();
    					}
    				}
    			}
    			System.out.println("文件夹“" + node + "”中的图片加载完毕!");
    		}
    	}
    
    	private class MButton extends JButton {
    
    		/**
    		 * 
    		 */
    		private static final long serialVersionUID = 1L;
    
    		@Override
    		protected void paintComponent(Graphics g) {
    			int width = getWidth();
    			int height = getHeight();
    			ImageIcon icon = new ImageIcon(getName());
    			g.drawImage(icon.getImage(), 0, 0, width, height - 25, this);
    			icon = null;
    			g.drawString(getText(), 5, height - 10);
    		}
    
    	}
    
    }
    
    

    运行效果:




    感想:
    这周主要是学习了高级swing组件-树,然后和之前学的组件,还有IO,一起写了一个很简单的读取本地电脑的程序,在写的过程中里呢,也遇到了几个问题,在我设置背景的时候,使用URL设置绝对路径,和this.getClass().getResource("")是有区别的,一个是在本类的文件路径下,就可以用this.getClass().getResource(""),里面的内容就不能使用绝对路径,刚开始没有弄明白,在这里浪费了比较多的时间,因为前面也没有怎么使用过this.getClass().getResource(""),一般我都是直接用的绝对路径(主要this.getClass().getResource()不用处理异常,绝对路径需要。不知道是不是这样,反正我写的时候,一个要加try catch语句一个不用。),然后这一次想换一下,emmm,然后就有问题了,不过在我百度之后,就明白了这俩个的区别,现在也会用了。然后其他的就是基本操作了,做起来也比较顺利(因为太简单了吧。。。),就这样吧。

    区别:

    this.getClass().getResource是得到当前对象对应的类文件(.class)所在的目录下的文件。所以通过this.getClass().getResource去获得C盘中的数据是获取不到的。*
    像C:login.wav这样的绝对路劲,你可以这样来获取:

    URL url = new File("C:\login.wav").toURI().toURL();
    

    补充:

    这个要看你的Pan这个类编译成的class文件在什么地方。this.getClass().getResource()是相对于Pan.class这个类文件的文件来说的,如果login.wav和Pan.class同一目录下,那么this.getClass().getResource("login.wav")就能获取到,如果login.wav是在Pan.class的下一级目录music下,那么就是

    this.getClass().getResource("music/login.wav")
    

    像这样的根据ClassLoader来获取资源的方式,应该不能查找上一级目录。如:
    this.getClass().getResource("../aa");这样好像是不行的。所以如果要取相对路径,那么要么就把login.wav和Pan.class文件放在同一目录,要么就把login.wav放在Pan.class的下一级目录。
    来源百度

    学习总结:

    一、简单的树

    树状结构是一种常用的信息表现形式,它可以直观的显示出一组信息的层次结构。Swing中的JTree类是用来创建树的,该类的常用构造方法如下:

    构造方法 内容
    JTree() 创建一个默认的树
    JTree(TreeNode node) 根据指定根节点创建树。
    JTree(TreeModel newModel) 根据指定树模型创建树.

    DefaultMutableTreeNode类 实现了TreeNode接口,用来创建树的节点,DefaultMutableTreeNode类的add()方法为节点添加子节点。
    DefaultTreeModel类 实现了TreeModel接口,该类提供了两个构造方法,所以在利用该类创建树模型时,必须指定树的根节点。
    构造方法如下:

    方法 区别
    DefaultTreeModel (TreeNode root)创建一个采用默认方式来判断节点是否为叶子节点的树模型。
    DefaultTreeModel (TreeNode root,boolean askAllowsChildren)创建一个采用指定方式来判断节点是否为叶子节点的树模型。

    二、处理选中节点事件

    树的节点允许被选中和选中状态,通过捕获树节点的选择事件,可以处理相应的操作树的选择模式有三种,通过TreeSelectionModel类的对象可以设置树的选择模式。可以通过JTree类
    的getSelctionModel()方法获得TreeSelectionModel类的对象,然后通过TreeSelctionModel类的setSelectionModel(int mode)方法设置选择模式,该方法的入口参数为:

    参数 用处
    SINGLE_TREE_SELECTION 只允许选中一个
    CONTIGUOUS_TREE_SELECTION 允许连续选择多个
    DISCONTIGUOUS_TREE_SELECTION 允许随意选中多个

    当选中树节点和取消树节点的选中状态时,将发出TreeSelectionEvent事件,通过实现TreeSelectionListener接口可以捕获该事件。TreeSelectionListener接口的具体定义:

    
    Public interface TreeSelectionListener extends EventListener{
    
         Void valueChanged(TreeSelectionEvent e);
    
    }
    
    

    当捕获发出的TreeSelectionEvent事件时,Void valueChanged(TreeSelectionEvent e)方法将被触发执行,此时可通过JTree类的getSelectionPaths()方法获得所有 被选中节点的路径,该方法将返回一个TreePath类型的数组;通过getSelectionPath()方法可以获取选中节点中的索引的最小的节点的路径,即TreePath对象,在此之前,可以通过JTree类的isSelectionEmpty()方法查看是否存在被选中的节点,可以通过getSelectionCount()方法可以获取被选中节点的数量。

    TreePath类的常用方法:

    方法 内容
    getPath() 以Object数组的形式返回该路径中所有节点的对象,在数组中的顺序按照从根节点到子节点的顺序。
    getLastPathComponent() 获得该路径中最后一个节点的对象。
    getParentPath() 获得路径中除了最后一个节点的路径
    pathByAddingChild() 获得向路径中添加指定节点后的路径
    getPathCount() 获得向路径中包含节点的数量
    getPathComponent(int element) 获得路径中指定索引位置的节点对象

    三、遍历树节点

    DefaultMutableTreeNode类提供了两组相对的遍历方式,如下:

    前序遍历和后序遍历是一组相对的遍历方式,方法分别为:preorderEnumeration()和postorderEnumeration()方法,返回的是枚举类型对象。

    广度优先遍历和深度优先遍历是一组相对的遍历方式,方法分别为:breadFirstEnumeration()和deptFirstEnumeration()方法,返回的是枚举类型对象。

  • 相关阅读:
    01-移动端 REM 适配(postcss-pxtorem,lib-flexible的使用)
    19-webpack性能优化集锦
    10-map/WeakMap/WeakSet的使用场景
    03-web worker vue项目实战
    ELFhash
    哈希查找
    Logger之Logger.getLogger(CLass)使用(转载)
    mybatis中多对一查询
    IDEA中无法打开查看log文件解决方案
    Self-Supervised Scene De-occlusion(转载)
  • 原文地址:https://www.cnblogs.com/xudo/p/11871538.html
Copyright © 2011-2022 走看看