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()方法,返回的是枚举类型对象。

  • 相关阅读:
    ubuntu下安装maven
    159.Longest Substring with At Most Two Distinct Characters
    156.Binary Tree Upside Down
    155.Min Stack
    154.Find Minimum in Rotated Sorted Array II
    153.Find Minimum in Rotated Sorted Array
    152.Maximum Product Subarray
    151.Reverse Words in a String
    150.Evaluate Reverse Polish Notation
    149.Max Points on a Line
  • 原文地址:https://www.cnblogs.com/xudo/p/11871538.html
Copyright © 2011-2022 走看看