ITEEDU

swing的版面结构

版面管理器

事件处理

鼠标事件

键盘事件处理

窗口与面板的使用

JInternalFrame的使用(窗口与面板)

JTabbedPane,JScroolPane,JScrolBa的使用

标签与按钮的使用与介绍

[复选框、选项按钮、列表方框、下拉式列表的使用与介绍]

表格(Table)的使用与介绍

JTable的事件处理

1文字输入组件的使用与介绍

树(Tree)的使用与介绍

对话框(Option Pane与Dialog)的使用与介绍

菜单与工具栏的使用与介绍

文件选择对话框,颜色选择对话框,分隔线的使用与介绍.

Slider,Timer,Progress的使用

10-7-2:处理TreeSelectionEvent事件:

当我们在JTree上点选任何一个节点,都会触发TreeSelectionEvent事件,如果我们要处理这样的事件,必须实作 TreeSelectionListener界面,此界面只定义了一个方法,那就是valueChanged()方法。

TreeSelectionEvent最常用在处理显示节点的内容,例如你在文件图标中点两下就可以看到文件的内容。在JTree中选择节点 的方式共有3种,这3种情况跟选择JList上的项目是一模一样的,分别是:

  • DISCONTIGUOUS_TREE_SELECTION:可作单一选择,连续点选择(按住[Shift]键),不连续选择多个节点(按住[Ctrl]键), 这是java默认值.
  • CONTINUOUS_TREE_SELECTION:按住[Shift]键,可对某一连续的节点区间作选取。 SINGLE_TREE_SELECTION:一次只能选一个节点。

你可以自行实作TreeSelectionModel制作作更复杂的选择方式,但通常是没有必要的,因为java提供了默认的选择模式类供我们 使用,那就是DefaultTreeSelectionModel,利用这个类我们可以很方便的设置上面3种选择模式。

下面这个范例,当用户点选了一个文件名时,就会将文件的内容显示出来。

TreeDemo7.java
import javax.swing.*;
import javax.swing.tree.*;
import javax.swing.event.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.*;
import com.incors.plaf.alloy.*;
import com.incors.plaf.alloy.themes.glass.*;

public class TreeDemo7 implements TreeSelectionListener {
	JEditorPane editorPane;

	public TreeDemo7() {
		JFrame f = new JFrame("TreeDemo");
		Container contentPane = f.getContentPane();
		DefaultMutableTreeNode root = new DefaultMutableTreeNode("资源管理器");
		DefaultMutableTreeNode node = new DefaultMutableTreeNode(
				"TreeDemo1.java");
		root.add(node);
		node = new DefaultMutableTreeNode("TreeDemo2.java");
		root.add(node);
		node = new DefaultMutableTreeNode("TreeDemo3.java");
		root.add(node);
		node = new DefaultMutableTreeNode("TreeDemo4.java");
		root.add(node);

		JTree tree = new JTree(root);
		// 设置Tree的选择模式为一次只能选择一个节点
		tree.getSelectionModel().setSelectionMode(
				TreeSelectionModel.SINGLE_TREE_SELECTION);
		// 检查是否有TreeSelectionEvent事件。
		tree.addTreeSelectionListener(this);

		// 下面五行,JSplitPane中,左边是放含有JTree的JScrollPane,右边是放JEditorPane.
		JScrollPane scrollPane1 = new JScrollPane(tree);
		editorPane = new JEditorPane();
		JScrollPane scrollPane2 = new JScrollPane(editorPane);
		JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,
				true, scrollPane1, scrollPane2);

		contentPane.add(splitPane);
		f.pack();
		f.setVisible(true);

		f.addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});
	}

	// 本方法实作valueChanged()方法
	public void valueChanged(TreeSelectionEvent e) {
		JTree tree = (JTree) e.getSource();
		// 利用JTree的getLastSelectedPathComponent()方法取得目前选取的节点.
		DefaultMutableTreeNode selectionNode = (DefaultMutableTreeNode) tree
				.getLastSelectedPathComponent();

		String nodeName = selectionNode.toString();

		// 判断是否为树叶节点,若是则显示文件内容,若不是则不做任何事。
		if (selectionNode.isLeaf()) {
			/*
			 * 取得文件的位置路径,System.getProperty("user.dir")可以取得目前工作的路径,
			 * System.getProperty("file.separator")是取得文件分隔符,例如在window环境的
			 * 文件分陋符是"\",而Unix环境的文件分隔符刚好相反,是"/".利用System.getProperty()
			 * 方法你可以取得下列的信息: java.version 显示java版本 java.endor 显示java制造商
			 * java.endor.url 显示java制造商URL java.home 显示java的安装路径
			 * java.class.version 显示java类版本 java.class.path 显示java classpath
			 * os.name 显示操作系统名称 os.arch 显示操作系统结构,如x86 os.version 显示操作系统版本
			 * file.separator 取得文件分隔符 path.separator 取得路径分隔符,如Unix是以“:”表示
			 * line.separator 取得换行符号,如Unix是以"\n"表示 user.name 取得用户名称 user.home
			 * 取得用户家目录(home directory),如Windows中Administrator的家目 录为c:\Documents
			 * and Settings\Administrator user.dir 取得用户目前的工作目录.
			 */
			String filepath = "file:" + System.getProperty("user.dir")
					+ System.getProperty("file.separator") + nodeName;

			try {
				// 利用JEditorPane的setPage()方法将文件内容显示在editorPane中。若文件路径错误,则会产生IOException.
				editorPane.setPage(filepath);
			} catch (IOException ex) {
				System.out.println("找不到此文件");
			}
		}
	}

	public static void main(String[] args) {
		SwingUtil.setLookAndFeel();
		new TreeDemo7();
	}
}

class SwingUtil {
	public static final void setLookAndFeel() {
		try {
			Font font = new Font("JFrame", Font.PLAIN, 12);
			Enumeration keys = UIManager.getLookAndFeelDefaults().keys();

			while (keys.hasMoreElements()) {
				Object key = keys.nextElement();
				if (UIManager.get(key) instanceof Font) {
					UIManager.put(key, font);
				}
			}
			AlloyLookAndFeel.setProperty("alloy.isLookAndFeelFrameDecoration",
					"true");
			AlloyTheme theme = new GlassTheme();
			LookAndFeel alloyLnF = new AlloyLookAndFeel(theme);
			JFrame.setDefaultLookAndFeelDecorated(true);

			UIManager.setLookAndFeel(alloyLnF);
		} catch (UnsupportedLookAndFeelException ex) {
			ex.printStackTrace();
		}
	}
}

10-8:JTree的其他操作:

我们在之前小节中曾说到Tree中的每一个节点都是一个TreeNode,并可利用JTree的setEditable()方法设置节点是否可编辑, 若要在Tree中找寻节点的父节点或子节点,或判断是否为树节点,皆可由实作TreeNode界面做到,但要编辑节点呢?java将编辑 节点的任务交给TreeCellEditor,TreeCellEditor本身是一个界面,里面只定义了getTreeCellEditor Component()方法,你可以实 作此方法使节点具有编辑的效果。不过你不用这么辛苦去实作这个方法,java本身提供了DefaultTreeCellEditor类来实作此方法 ,亦提供了其他许多方法,例如取得节点内容(getCellEditorValue()) 、设置节点字体(setFont())、决定节点是否可编辑 (isCellEditable())等等。除非你觉得DefaultTreeCellEditor所提供的功能不够,你才需要去实作TreeCellEditor界面。你可以利 用JTree的getCellEditor()方法取得DefaultTreeCellEditor对象。当我们编辑节点时会触发ChangeEvent事件,你可以实作 CellEditorListener界面来处理此事件,CellEditorListener界面包括两个方法,分别是editingStopped(ChangeEvent e)与 editingCanceled(ChangeEvent e).若你没有实作TreeCellEditor界面,系统会以默认的DefaultTreeCellEdtior类来处理掉这两个 方法(你可以在DefaultTreeCellEditor中找到这两个方法),因此你无须再编写任何的程序。

另外,JTree还有一种事件处理模式,那就是TreeExpansionEvent事件。要处理这个事件你必须实作TreeExpansionListener 界面,此界面定义了两个方法,分别是treeCollapsed(TreeExpansionEvent e)与treeExpanded(TreeExpansionEvent e).当节点展 开时系统就会自动调用treeExpanded()方法,当节点合起来时,系统就会自动调用treeCollapsed()方法。你可以在这两个方法中编 写所要处理事情的程序代码。处理事件的过程我们已在上面举过多次,这里就不再重复了.