Swing程序设计(七)——树组件

树组件(JTree)

一棵树只能有一个父节点,可以有0个或者多个子节点,默认情况下,每个节点允许有子节点,可以设置为不允许有子节点。
常用构造方法:
public JTree() 创建一个默认的树
public JTree(TreeNode root) 根据根节点创建树
public JTree(TreeModel newModel) 根据指定树模型创建树

常用方法说明
public boolean isSelectionEmpty()查看是否存在被选中的节点,如果选择当前为空,则返回true。
public TreeSelectionModel getSelectionModel()获得树选项模型,可以用来设置选择模式
public int getSelectionCount()获得被选中节点的数量
public TreePath getSelectionPath()获得选中节点中索引值最小的节点的路径
public TreePath[] getSelectionPaths()返回所有被选中节点的路径。
public void setRootVisible(boolean rootVisible)确定 TreeModel 的根节点是否可见。
public void setShowsRootHandles(boolean newValue)设置 showsRootHandles 属性的值,它指定是否应显示节点句柄。
public TreeCellRenderer getCellRenderer()返回正在呈现每个单元格的当前 TreeCellRenderer。
public void setRowHeight(int rowHeight)设置每个单元格的高度(以像素为单位)。如果指定的值小于或等于零,则会查询当前单元格渲染器以获取每个行的高度。
public void setFont(Font font)设置此组件的字体。
public void setSelectionPath(TreePath path)选择指定路径标识的节点。
public boolean isVisible(TreePath path)如果当前可查看路径标识的值,则返回 true,这意味着该路径或者是根路径,或者它的所有父路径均被展开。否则,此方法返回 false。简单点说就是是否有将该节点展开显示出来
public void makeVisible(TreePath path)确保路径标识的节点当前可查看。就是强制展开显示出来
public void setModel(TreeModel newModel)设置将提供数据的 TreeModel。
public void expandPath(TreePath path)确保指定路径标识的节点展开,并且可查看。如果路径中的最后一项是叶节点,则无效。(就是展开节点)
public Object getLastSelectedPathComponent()返回所选路径的最后一个路径组件。

DefaultMutableTreeNode(树节点)
DefaultMutableTreeNode实现了TreeNode树节点接口,用来创建树的节点。
常用构造方法:
public DefaultMutableTreeNode() 创建一个树节点,没有父节点,没有子节点,但它允许子节点。
public DefaultMutableTreeNode(Object userObject) 创建一个具有指定标签的节点。
public DefaultMutableTreeNode(Object userObject,boolean allowsChildren) 创建一个具有指定标签的节点,并指定是否允许有子节点。

常用方法说明
public void add(MutableTreeNode newChild)为该节点添加子节点
public Enumeration preorderEnumeration()返回按前序遍历的枚举对象
public Enumeration postorderEnumeration()返回按后序遍历的枚举对象
public Enumeration breadthFirstEnumeration()返回以广度优先遍历的枚举对象
public Enumeration depthFirstEnumeration()返回以深度优先遍历的枚举对象
public Enumeration children()返回仅包含该节点子节点的枚举对象
public int getLevel()获得该节点相对于根节点的级别值,如根节点的子节点的级别值为1
public int getDepth()获得以此节点为根节点的树的深度,如果该节点没有子节点,则深度为0
public TreeNode getParent()获得该节点的父节点对象
public int getChildCount()返回此节点的子节点数。
public TreeNode getChildAt(int index)返回此节点的子节点数组中指定索引处的子节点。
public TreeNode getFirstChild()返回此节点的第一个子节点。 如果此节点没有子节点,则抛出NoSuchElementException。
public int getSiblingCount()返回此节点的兄弟节点数。
public DefaultMutableTreeNode getNextSibling()获得该节点的后一个兄弟节点
public DefaultMutableTreeNode getPreviousSibling()获得该节点的前一个兄弟节点
public TreeNode[] getPath()返回从根到达此节点的路径。该路径中最后一个元素是此节点。
public boolean isRoot()如果此节点是树的根,则返回 true。根是树中父节点为 null 的唯一节点;每棵树只有一个根。
public boolean isLeaf()如果此节点没有子节点,则返回 true。要区分没有子节点的节点和不能拥有子节点的节点
public void setUserObject(Object userObject)将此节点的用户对象设置为 userObject 。即修改用户标签
public Object getUserObject()返回此节点的用户对象。即获得用户标签

DefaultTreeModel(树模型)
DefaultTreeModel实现了TreeModel接口。
常用构造方法:
public DefaultTreeModel(TreeNode root) 创建一个采用默认方式判断节点是否为叶子节点的树模型。
public DefaultTreeModel(TreeNode root,boolean asksAllowsChildren) 创建一个采用指定方式判断节点是否为叶子节点的树模型。
注意:判断节点是否为叶子节点有两种方式:1.默认方式:如果节点不存在子节点,则为叶子节点。2.根据节点是否允许有子节点进行判断,只要不允许有子节点就是叶子节点,如果允许有子节点,即使并不包含任何子节点,也不是叶子节点。当asksAllowsChildren为true时,采用第二种判断方式。

常用方法说明
public void insertNodeInto(MutableTreeNode newChild,MutableTreeNode parent,int index)对它进行调用,以便在父节点的子节点中的 index 位置插入 newChild。(添加树节点)。newChild:新添加节点对象;parent:新添加节点所属父节点对象,该对象必须为树模型中的一个节点;index:新添加节点在其父节点中的索引位置,索引值从0开始
public void nodeChanged(TreeNode node)更改节点在树中的表示方式之后,调用此方法。(修改节点)
public void removeNodeFromParent(MutableTreeNode node)通知它从其父节点中移除节点。
代码示例:
public class ExampleFrame_01 extends JFrame {
	private static final long serialVersionUID = 1L;
	public static void main(String args[]) {
		ExampleFrame_01 frame = new ExampleFrame_01();
		frame.setVisible(true);
	}
	
	public ExampleFrame_01() {
		super();
		setTitle("简单的树");
		setBounds(100, 100, 500, 375);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		// 创建根节点
		DefaultMutableTreeNode root = new DefaultMutableTreeNode("根节点");
		// 创建一级节点
		DefaultMutableTreeNode nodeFirst = new DefaultMutableTreeNode(
				"一级子节点A");
		root.add(nodeFirst);// 将一级节点添加到根节点
		DefaultMutableTreeNode nodeSecond = new DefaultMutableTreeNode(
				"二级子节点", false);// 创建不允许有子节点的二级节点
		nodeFirst.add(nodeSecond);// 将二级节点添加到一级节点
		root.add(new DefaultMutableTreeNode("一级子节点B"));// 创建一级节点
		JTree treeRoot = new JTree(root);// 利用根节点直接创建树
		getContentPane().add(treeRoot, BorderLayout.WEST);
		// 利用根节点创建树模型,采用默认的判断方式
		DefaultTreeModel treeModelDefault = new DefaultTreeModel(root);
		// 利用树模型创建树
		JTree treeDefault = new JTree(treeModelDefault);
		getContentPane().add(treeDefault, BorderLayout.CENTER);
		// 利用根节点创建树模型,并采用非默认的判断方式
		DefaultTreeModel treeModelPointed = new DefaultTreeModel(root,
				true);
		JTree treePointed = new JTree(treeModelPointed);// 利用树模型创建树
		getContentPane().add(treePointed, BorderLayout.EAST);
	}
}

TreeSelectionModel(树选项模型)
通过TreeSelectionModel(树选项模型)接口可以设置树的选择模式

常用方法说明
void setSelectionMode(int mode)设置选择模型,它必须是SINGLE_TREE_SELECTION,CONTIGUOUS_TREE_SELECTION或DISCONTIGUOUS_TREE_SELECTION之一

选择模式静态常量:

静态常量常量值说明
SINGLE_TREE_SELECTION1只允许选中一个
CONTIGUOUS_TREE_SELECTION2允许连续选中多个
DISCONTIGUOUS_TREE_SELECTION4允许任意选中多个,为树的默认模式

TreeSelectionListener接口和TreeSelectionEvent
TreeSelectionListener接口:
树组件注册监听器:addTreeSelectionListener(TreeSelectionListener listener )
void valueChanged(TreeSelectionEvent e):当节点被选中或取消时触发
(Tree)e.getSource()为被选中节点的树对象。


TreePath类
TreePath表示树节点的路径。TreePath 是 TreeModel 提供的 Objects 的数组。对数组的元素进行排序,使根始终是数组的第一个元素 (index 为 0)。

常用方法说明
public Object[] getPath()返回此TreePath的元素的有序数组。 第一个元素是根,即以Object数组的形式 返回该路径中所有节点的对象,在数组中的顺序按照从根节点到子节点的顺序。
public Object getLastPathComponent()返回此路径的最后一个元素。即此路径最后一个节点的对象
public TreePath getParentPath()返回父母的TreePath 。 返回值为null表示这是根节点。
public TreePath pathByAddingChild(Object child)获得向路径中添加指定节点后的路径
public int getPathCount()返回路径中包含节点的数量
public Object getPathComponent(int index)返回路径中指定索引位置的节点对象

遍历树节点
1.前序遍历
2.后序遍历
3.广度优先遍历
4.深度优先遍历
DefaultMutableTreeNode类提供了两组相对的遍历方式:

方法说明
public Enumeration preorderEnumeration()返回按前序遍历的枚举对象
public Enumeration postorderEnumeration()返回按后序遍历的枚举对象
public Enumeration breadthFirstEnumeration()返回以广度优先遍历的枚举对象
public Enumeration depthFirstEnumeration()返回以深度优先遍历的枚举对象
public Enumeration children()返回仅包含该节点子节点的枚举对象

注意:因为后序遍历和深度优先遍历这两种遍历方式的具体方法相同,实际上方法depthFirstEnumeration()只是调用了方法postorderEnumeration()。

Enumeration<?> enumeration; // 按前序遍历所有树节点
		enumeration = root.preorderEnumeration();
		while (enumeration.hasMoreElements()) {
			DefaultMutableTreeNode node;
			node = (DefaultMutableTreeNode) enumeration.nextElement();
			if (!node.isLeaf()) {// 判断是否为叶子节点
				// 创建该节点的路径
				TreePath path = new TreePath(node.getPath());
				tree.expandPath(path);// 如果不是则展开该节点
			}

定制树
1.定制根节点效果:默认情况下显示树的根节点,但是不显示根节点手柄。可通过如下JTree类中的方法设置:

方法说明
public void setRootVisible(boolean rootVisible)确定 TreeModel 的根节点是否可见。
public void setShowsRootHandles(boolean newValue)设置 showsRootHandles 属性的值,它指定是否应显示节点句柄。

2.定制图标:通过DefaultTreeCellRenderer类(为TreeCellRenderer接口的实现类)的对象可以修改节点图标,通过JTree类的public TreeCellRenderer getCellRenderer()(强转)方法获得,如下:

方法说明
public void setLeafIcon(Icon newIcon)设置用于表示叶节点的图标。
public void setClosedIcon(Icon newIcon)设置用于表示没有扩展的非叶节点的图标。
public void setOpenIcon(Icon newIcon)设置用于表示扩展的非叶节点的图标。

3.定制连接线效果:默认情况下在树节点之间绘制连接线,通过public final void putClientProperty(Object key,Object value)设置连接线的绘制方式。此时要将入口参数key设置为"JTree.lineStyle"。value为None,表示不绘制节点之间的连接线;设置为Horizontal,表示绘制水平分栏线;设置为Angled,表示绘制节点间的连接线,等效于默认设置。

4.默认情况下只有树的根节点是展开的,其他子节点均处于折叠状态。如果希望在初次运行时树的某一节点就处于展开状态,通过public void expandPath(TreePath path)方法实现,需要传入展开节点的路径。

public class ExampleFrame_04 extends JFrame {
	private static final long serialVersionUID = 1L;
	private JTree tree;
	public static void main(String args[]) {
		ExampleFrame_04 frame = new ExampleFrame_04();
		frame.setVisible(true);
	}
	public ExampleFrame_04() {
		super();
		setTitle("定制树");
		setBounds(100, 100, 200, 325);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		DefaultMutableTreeNode root;
		root = new DefaultMutableTreeNode("企业人事管理系统");
		DefaultMutableTreeNode nodeFirstA;
		nodeFirstA = new DefaultMutableTreeNode("人事管理");
		nodeFirstA.add(new DefaultMutableTreeNode("账套管理"));
		nodeFirstA.add(new DefaultMutableTreeNode("考勤管理"));
		nodeFirstA.add(new DefaultMutableTreeNode("奖惩管理"));
		nodeFirstA.add(new DefaultMutableTreeNode("培训管理"));
		root.add(nodeFirstA);
		DefaultMutableTreeNode nodeFirstB;
		nodeFirstB = new DefaultMutableTreeNode("待遇管理");
		nodeFirstB.add(new DefaultMutableTreeNode("帐套管理"));
		nodeFirstB.add(new DefaultMutableTreeNode("人员设置"));
		nodeFirstB.add(new DefaultMutableTreeNode("待遇报表"));
		root.add(nodeFirstB);
		DefaultMutableTreeNode nodeFirstC;
		nodeFirstC = new DefaultMutableTreeNode("系统维护");
		nodeFirstC.add(new DefaultMutableTreeNode("企业架构"));
		nodeFirstC.add(new DefaultMutableTreeNode("基本资料"));
		nodeFirstC.add(new DefaultMutableTreeNode("系统初始化"));
		root.add(nodeFirstC);
		tree = new JTree(root);
		tree.setRootVisible(false);// 不显示树的根节点
		tree.setRowHeight(20);// 树节点的行高为20像素
		tree.setFont(new Font("宋体", Font.BOLD, 14));// 设置树结点的字体
		// 节点间不采用连接线
		tree.putClientProperty("JTree.lineStyle", "None");
		DefaultTreeCellRenderer treeCellRenderer;// 获得树节点的绘制对象
		treeCellRenderer = (DefaultTreeCellRenderer) tree
				.getCellRenderer();
		treeCellRenderer.setLeafIcon(null);// 设置叶子节点不采用图标
		treeCellRenderer.setClosedIcon(null);// 设置节点折叠时不采用图标
		treeCellRenderer.setOpenIcon(null);// 设置节点展开时不采用图标
		Enumeration<?> enumeration; // 按前序遍历所有树节点
		enumeration = root.preorderEnumeration();
		while (enumeration.hasMoreElements()) {
			DefaultMutableTreeNode node;
			node = (DefaultMutableTreeNode) enumeration.nextElement();
			if (!node.isLeaf()) {// 判断是否为叶子节点
				// 创建该节点的路径
				TreePath path = new TreePath(node.getPath());
				tree.expandPath(path);// 如果不是则展开该节点
			}
		}
		getContentPane().add(tree, BorderLayout.CENTER);
	}
}

维护树模型
1.添加树节点(向树模型中添加新的节点)
2.修改树节点:DefaultTreeModel类中nodeChanged(TreeNode node)方法用来通知树模型某节点已经被修改,如果修改的是节点的用户对象,修改的信息将不会被同步到GUI界面。
3.删除树节点:从树模型中删除指定节点。

方法说明(属于DefaultTreeModel树模型中的方法)
public void insertNodeInto(MutableTreeNode newChild,MutableTreeNode parent,int index)对它进行调用,以便在父节点的子节点中的 index 位置插入 newChild。(添加树节点)。newChild:新添加节点对象;parent:新添加节点所属父节点对象,该对象必须为树模型中的一个节点;index:新添加节点在其父节点中的索引位置,索引值从0开始
public void nodeChanged(TreeNode node)更改节点在树中的表示方式之后,调用此方法。(修改节点)node为修改后的节点对象。
public void removeNodeFromParent(MutableTreeNode node)通知它从其父节点中移除节点。
1.添加节点
		addButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				DefaultMutableTreeNode node = new DefaultMutableTreeNode(
						textField.getText());// 创建欲添加节点
				TreePath selectionPath = tree.getSelectionPath();// 获得选中的父节点路径
				DefaultMutableTreeNode parentNode = (DefaultMutableTreeNode) selectionPath.getLastPathComponent();// 获得选中的父节点
				treeModel.insertNodeInto(node, parentNode, parentNode
						.getChildCount());// 插入节点到所有子节点之后
				TreePath path = selectionPath.pathByAddingChild(node);// 获得新添加节点的路径
				if (!tree.isVisible(path))
					tree.makeVisible(path);// 如果该节点不可见则令其可见
			}
		});
		
2.修改节点
		updButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				// 获得选中的欲修改节点的路径
				TreePath selectionPath = tree.getSelectionPath();
				DefaultMutableTreeNode node = (DefaultMutableTreeNode) selectionPath
						.getLastPathComponent();// 获得选中的欲修改节点
				node.setUserObject(textField.getText());// 修改节点的用户标签
				treeModel.nodeChanged(node);// 通知树模型该节点已经被修改
				tree.setSelectionPath(selectionPath);// 选中被修改的节点
			}
		});
		
3.删除节点
		delButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				DefaultMutableTreeNode node = (DefaultMutableTreeNode) tree
						.getLastSelectedPathComponent();// 获得选中的欲删除节点
				// 查看欲删除的节点是否为根节点,根节点不允许删除
				if (!node.isRoot()) {
					DefaultMutableTreeNode nextSelectedNode = node
							.getNextSibling();// 获得下一个兄弟节点,以备选中
					if (nextSelectedNode == null)// 查看是否存在兄弟节点
						nextSelectedNode = (DefaultMutableTreeNode) node
								.getParent();// 如果不存在则选中其父节点
					treeModel.removeNodeFromParent(node);// 删除节点
					tree.setSelectionPath(new TreePath(nextSelectedNode
							.getPath()));// 选中节点
				}
			}
		});


处理展开节点事件
1.TreeWillExpandListener接口和TreeExpansionEvent
2.TreeExpansionListener接口和TreeExpansionEvent

监听接口事件名称描述
TreeWillExpandListenerTreeExpansionEvent当展开和折叠树节点时,将发出TreeExpansionEvent事件,通过实现TreeWillExpandListener接口可以在树节点展开和折叠之前捕获该事件。
TreeExpansionListenerTreeExpansionEvent通过实现TreeExpansionListener接口可以在树节点展开和折叠时捕获该事件

监听接口方法及说明:
1.TreeWillExpandListener接口:
可用于需要验证用户权限,如果用户没有权限查看该节点包含的子节点,则不允许树节点展开。

方法触发
void treeWillExpand(TreeExpansionEvent event) throws ExpandVetoException每当树中的一个节点将被扩展时调用。
void treeWillCollapse(TreeExpansionEvent event) throws ExpandVetoException每当树中的一个节点将被折叠时调用。

2.TreeExpansionListener接口:

方法触发
void treeExpanded(TreeExpansionEvent event)每当树中的一个项被扩展时调用。
void treeCollapsed(TreeExpansionEvent event)每当树中的一个项被折叠时调用。

3.TreeExpansionEvent

常用方法说明
public TreePath getPath()返回到达已被扩展/折叠的值的路径。
示例如下:
tree.addTreeWillExpandListener(new TreeWillExpandListener() {
	// 树节点将要被折叠时触发
	public void treeWillCollapse(TreeExpansionEvent e) {
		TreePath path = e.getPath();// 获得将要被折叠节点的路径
		DefaultMutableTreeNode node = (DefaultMutableTreeNode) path
				.getLastPathComponent();// 获得将要被折叠的节点
		System.out.println("节点“" + node + "”将要被折叠!");
	}
	
	// 树节点将要被展开时触发
	public void treeWillExpand(TreeExpansionEvent e) {
		TreePath path = e.getPath();// 获得将要被展开节点的路径
		DefaultMutableTreeNode node = (DefaultMutableTreeNode) path
				.getLastPathComponent();// 获得将要被展开的节点
		System.out.println("节点“" + node + "”将要被展开!");
	}
});
// 捕获树节点已经被展开或折叠的事件
tree.addTreeExpansionListener(new TreeExpansionListener() {
	// 树节点已经折叠时触发
	public void treeCollapsed(TreeExpansionEvent e) {
		TreePath path = e.getPath();// 获得已经被折叠节点的路径
		DefaultMutableTreeNode node = (DefaultMutableTreeNode) path
				.getLastPathComponent();// 获得已经被折叠的节点
		System.out.println("节点“" + node + "”已经被折叠!");
		System.out.println();
	}
	
	// 树节点已经被展开时触发
	public void treeExpanded(TreeExpansionEvent e) {
		TreePath path = e.getPath();// 获得已经被展开节点的路径
		DefaultMutableTreeNode node = (DefaultMutableTreeNode) path
				.getLastPathComponent();// 获得已经被展开的节点
		System.out.println("节点“" + node + "”已经被展开!");
		System.out.println();
	}
});
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
杨教授工作室 精心创作的优秀程序员 职业提升必读系列资料 杨教授工作室,版权所有,盗版必究, 1/16 页 1.1 Java Swing GUI 组件技术教学参考示例(第 2 部分) 1.1.1 Swing ToolBar 组件的应用实例 1、窗口内的内容面板 JFrame 对象本身是不能附加组件的(尽管它为顶层容器,但是不能把组件直接加到顶层 容器中),也就是说调用 frame.append(...)这样的方法会出错,是不正确的。添加组件应该放 在内容面板(Content Panel),内容面板是一个 Container 对象,添加到 JFrame 的组件都只能放 到它上面。 Swing 窗体中含有一个称为内容面板的容器(ContentPane),在顶层容器上放内容面板, 然后把组件加入到内容面板中。 2、JToolBar 是用于显示常用工具控件的容器 (1)主要的用途 一般我们在设计软件时, 会将所有功能依类放置在菜单中(JMenu),但当功能数量相当多时, 可能造成用户操作一个简单的操作就必须繁复的寻找菜单中相关的功能,这将造成用户操作 上的负担。若我们能将一般常用的功能以工具栏方式呈现在菜单下,让用户很快得到他想要 的功能,不仅增加用户使用软件的意愿,也加速工作的运行效率.这就是使用 ToolBar 的好处。 (2)用户可以拖拽出一个独立的可显示工具控件的窗口,常用方法有: 1) JToolBar(String name) //构造方法 2) getComponentIndex(Component c) //返回一个组件的序号 3) getComponentAtIndex(int i) //得到一个指定序号的组件 3、添加一个 NavigatorToolBar (1)从 javax.swing.JToolBar 继承、包名称为 com.px1987.javaapplication.swing.toolbar 杨教授工作室 精心创作的优秀程序员 职业提升必读系列资料 杨教授工作室,版权所有,盗版必究, 2/16 页 (2)NavigatorToolBar 类的代码示例 package com.px1987.javaapplication.swing.toolbar; import javax.swing.ImageIcon; import javax.swing.JLabel; import javax.swing.JToolBar; import com.px1987.javaapplication.swing.SwingExplorerMainFrame; public class NavigatorToolBar extends JToolBar { private SwingExplorerMainFrame oneSwingExplorerMainFrame=null; JLabel backButton=null; JLabel pullDownButton=null; public NavigatorToolBar() { super(); } 杨教授工作室 精心创作的优秀程序员 职业提升必读系列资料 杨教授工作室,版权所有,盗版必究, 3/16 页 public NavigatorToolBar(String name,SwingExplorerMainFrame oneSwingExplorerMainFrame) { super(name); this.oneSwingExplorerMainFrame=oneSwingExplorerMainFrame; this.setFloatable(false); //设置该工具条不可拖动 createAllButtonsInToolBar(); } public NavigatorToolBar(int orientation) { super(orientation); } public NavigatorToolBar(String name) { super(name); } public NavigatorToolBar(String name, int orientation) { super(name, orientation); } public void createAllButtonsInToolBar(){ backButton=new JLabel("后退"); backButton.setToolTipText("点击我可以回退到上个面板"); backButton.setIcon(new ImageIcon(getClass().getResource( "/images/mainframe/toolbar/navigator/b
杨教授工作室 精心创作的优秀程序员 职业提升必读系列资料 杨教授工作室,版权所有,盗版必究, 1/22 页 1.1 模拟实现 Windows 资源管理器的 GUI 界面(第 3 部分) 1.1.1 为主窗口添加工具条 1、在窗口的北部添加一个工具条面板——选择 Swing Containers 内的 Tool Bar 组件 (1)添加一个面板(Panel)组件并直接拖到窗口的北部(顶部) (2)设置面板的对象名 (3)设置该面板的大小 杨教授工作室 精心创作的优秀程序员 职业提升必读系列资料 杨教授工作室,版权所有,盗版必究, 2/22 页 (4)改变它的布局方式 (5)将布局设置为 2 行 1 列 2、在该北部面板中添加两个工具条 (1)拖放导航工具条组件到该面板中 杨教授工作室 精心创作的优秀程序员 职业提升必读系列资料 杨教授工作室,版权所有,盗版必究, 3/22 页 最好采用右击面板的对象名的方式实现,将会更简捷。 (2)改变该工具条的对象名为 oneNavigatorToolBar、设置工具条的大小等属性 (3)再添加另一个工具条 oneAddressInfoToolBar 作为地址栏工具条 3、分别在这两个工具条中添加工具按钮——选择 Swing Controls 内的 Button 组件 (1)在 oneNavigatorToolBar 工具条中添加各个工具按钮 杨教授工作室 精心创作的优秀程序员 职业提升必读系列资料 杨教授工作室,版权所有,盗版必究, 4/22 页 (2)分别设置这些按钮的属性(图标、tooltip 文字、对象名等) 可以选择"Image Within Project"方式,然后在 Package 栏中定位到目标图片所在的目录; 最后在 File 栏目中选择目标图片的文件名称。 也可以采用下面的代码形式 new ImageIcon(getClass().getResource("/images/mainframe/toolbar/navigator/back.jpg")) 杨教授工作室 精心创作的优秀程序员 职业提升必读系列资料 杨教授工作室,版权所有,盗版必究, 5/22 页 该按钮的图标将出现在按钮的界面中。 (3)如果设置为不画出按钮的边框线,从而将能够产生出 Windows XP 系统风格界面的工具 条 将按钮的"BorderPainted"属性设置为 false,并取消其对钩。 (4)将组合框组件改变为可编辑状态 杨教授工作室 精心创作的优秀程序员 职业提升必读系列资料 杨教授工作室,版权所有,盗版必究, 6/22 页 (5)为工具条中的按钮添加鼠标单击事件 事件类型与命令形式的菜单项目完全相同,也是 Action 类型的事件。 4、在另一个工具条中添加按钮——方法和思路同前面 5、为地址栏工具条中的 Label 标签组件添加简化键 (1)方法一:在该标签的"displayedMnemonic"成员属性中直接输入字符"D" 杨教授工作室 精心创作的优秀程序员 职业提升必读系列资料 杨教授工作室,版权所有,盗版必究, 7/22 页 (2)方法二:在该标签的"displayedMnemonic"成员属性中的"User Code"方式下输入字 符'D' 6、为工具条中的按钮添加"分隔条"从而产生出按钮相互分隔的效果 杨教授工作室 精心创作的优秀程序员 职业提升必读系列资料 杨教授工作室,版权所有,盗版必究, 8/22 页 1.1.2 设计和实现中间的分隔面板 1、在窗口中间添加一个分隔面板 (1)选择 Swing Containers 内的 Split Panel 组件 (2)改变该组件的对象名为 centerSplitPane (3)设置大小等属性 杨教授工作室 精心创作的优秀程序员 职业提升必读系列资料 杨教授工作室,版权所有,盗版必究, 9/22 页 最终产生出的属性设置的代码如下: centerSplitPane.setDividerSize(5); centerSplitPane.setDividerLocation(180); centerSplitPane.setEnabled(false); //分割条不可拖动 界面的设计结果如下图所示: 2、在分隔面板的左面和右面分别添加滚动面板组件 添加滚动面板组件的主要目的是能够为其中的组件和表格组件提供滚动条效果。 杨教授工作室 精心创作的优秀程序员 职业提升必读系列资料 杨教授工作室,版权所有,盗版必究, 10/22 页 并调整分隔条的粗细和初始摆放的位置。 3、在左面的滚动面板组件内添加组件 (1)添加 (2)改变对象名称为 directoryTree 杨教授工作室 精心创作的优秀程序员 职业提升必读系列资料 杨教授工
目录 目录 1 (一) Spring 开发 Swing GUI 简介——依赖注入和富客户机 5 关于本教程 5 前提条件 6 Spring 和依赖注入概述 7 什么是 Spring 框架? 7 什么是依赖注入? 7 环境设置 7 选择编译环境 7 设置 Ant 8 通过 Ant 自动下载依赖软件 10 设置 Maven 10 通过 Maven 自动下载依赖软件 12 设置 Eclipse 13 下载依赖的 JAR 文件并在 Eclipse 的 classpath 中定义这种依赖性 15 创建 to-do 列表:基本的 Swing 和 Spring 应用程序设置 17 创建 MainFrame、Launcher 和 ToDo 类 17 创建 Spring app-context.xml bean 定义文件 19 运行应用程序 20 定义 bean 属性 21 创建 to-do 列表:创建一个可重用组件并在表中显示数据 23 创建一个可重用的面板 23 将 bean 组合在一起 24 添加一个表并重用这个面板 26 定义表模型 28 显示列表中的项 29 创建 to-do 列表:完成 —— 按钮和监听程序 31 创建按钮和监听程序 32 组合按钮和监听程序 35 Spring Rich Client Project 37 Spring Rich Client Project 概述 37 结束语 38 (二) 适用于各类Swing应用的通用数据验证模块 39 项目创建好后,加入类库: 41 然后写一个persistence bean: 41 Java代码 41 我称这个类为HibernateValidationUI,代码如下: 43 Java代码 43 类中用到的Java2DIconFactory代码如下: 47 Java代码 47 Factory类 49 Java代码 49 最后,我们可以编写一个Demo application来看看效果如何,代码如下: 51 Java代码 51 总结: 55 (三) 对JTree从创建到使用详解 56 (四) JTree的使用方法 57 JTreeDemo.java源程序 57 经验汇总 60 1. 初始化 60 2. 三个经常使用的取值函数 60 3. 根据node得到path: 60 4. 根据Path展开到该节点 60 5. 根据path设定该节点选定 61 6. 选中节点的方法 61 7. 滚动到可见位置 61 8. 给JTree添加右键弹出菜单 61 9. 关于JTree的展开 61 10. 如何遍历JTree 62 (五) JTree右键菜单实现编辑、添加、删除节点 63 Test.java源代码 63 (六) 功能齐全的JTree例子 66 TreeEditTest.java源代码 66 () JTree控件的使用 70 构造函数: 70 TreeModel接口 70 DefaultTreeModel缺省版本 71 TreeNode接口 71 TreeExpansionListener接口 71 TreeCellRenderer 72 例子: 73 (八) 如何为JTree添加右键菜单? 75 (九) 如何使JTextArea随着窗体的变化自动调整大小 76 TextAreaTest源代码 76 (十) JAVA swing编程JTree实现系统目录 77 FileTree1.java源代码 77 (十一) Java Swing中的JTree模型 85 Swing.tree包中的主要类名称实现 85 1. 构建模型 86 2. 结点 86 结构详细类图 86 2.1 TreeNode接口 86 2.2 MutableTreeNode接口 87 2.3 DefaultMutableTreeNode类 88 3. 编辑 88 3.1获得结点路径 88 3.2编辑结点 88 3.3视图显示 89 4. 查找 89 5. 绘制结点 90 (十二) JTree鼠标左键的双击事件选用那个监听器 91 MouseDemo.java源代码 92 (十三) JTree 92 JTree的构造函数: 93 JTreeDefaultDemo.java源代码 93 (十四) JTree 应用 96 Frame1.java源代码 96 MyDefaultTreeCellRenderer.java源代码 98 (十五) JTree控件 100 和节点的基本概念 100 有关JTree的类和接口 100 代码实例:构建一棵 101 相关语句解释 101 (十六) JTree应用示例——文件路径 103 AnimatedIconTreeExample.java源代码 103 //内部类NodeImageObserver.java源代码 105 //IconNodeRenderer.java源代码 106 //IconNode.java源代码 107 (十) Swing 学习笔记 108 Swing API 包括18个公共包: 108 例程1.1 HelloWorldSwing.java 109 例程2.2 HelloWorldJFrame.java 110 (十八) 动态加载文件的java程序 111 FileSystemTree.java源代码 112 //内部类 TreeWillExpandListenerImp.java 114 (十九) 向 Java 应用程序伸出援助之手——用 JavaHelp 2.0 构建下一个 Java 应用程序的帮助系统 115 入门 116 使用 HelpSet 117 HelpSet 数据文件 118 helpset 文件 118 maps 部分 119 view 部分 119 presentation 部分 120 implementation 部分 121 map 文件 121 导航文件 121 TOC 122 Index 122 Glossary 123 Favorites 123 主题文件 123 在 Java 应用程序中调用 JavaHelp 124 自定义外观 125 配置图标 125 基于文字的标签还是基于图像的标签? 125 要工具栏还是不要工具栏? 125 设置字体 126 使用展示窗口 127 <object> 标签 128 四种 activator 129 添加内容敏感的帮助 130 窗口级帮助 131 字段级帮助 131 屏幕级帮助 133 添加嵌入帮助 135 添加搜索功能 136 停用词 137 自定义停用词列表 137 合并 helpset 138 静态和动态合并 139 添加轻量级组件 141 基于服务器的帮助 144 设置 144 JavaHelp 服务器 bean 144 JavaScript 文件 145 JSP 文件 145 测试服务器端帮助 148 结束语 149
杨教授工作室 精心创作的优秀程序员 职业提升必读系列资料 杨教授工作室,版权所有,盗版必究, 1/19 页 1.1 应用 Java Swing GUI 组件技术实现课程选课系统 GUI 窗口(第 1 部分) 1.1.1 实现选课系统的主窗口 SystemMainWindow 的 UI 界面 1、添加一个主窗口 类名称为 SystemMainWindow,包名称为 com.px1987.course.ui 将出现窗口界面的创建结果。 2、在主窗口内添加 5 个功能按钮 (1)添加 JButton 组件 杨教授工作室 精心创作的优秀程序员 职业提升必读系列资料 杨教授工作室,版权所有,盗版必究, 2/19 页 (2)重复添加 5 个 JButton 组件 杨教授工作室 精心创作的优秀程序员 职业提升必读系列资料 杨教授工作室,版权所有,盗版必究, 3/19 页 3、分别设置 5 个按钮的属性 (1)提示文字改变为如下的文字信息 杨教授工作室 精心创作的优秀程序员 职业提升必读系列资料 杨教授工作室,版权所有,盗版必究, 4/19 页 (2)改变各个按钮的对象名称以方便后面的编程实现 5 个按钮的对象名称方便为: 1) 系统注册按钮:systemRegisterButton 2) 系统登录按钮:systemLoginButton 3) 在线选课按钮:selectCourseButton 4) 退选课程按钮:removeCourseButton 5) 退出系统按钮:exitSystemButton (3)修改后的结果如下 4、为 5 个按钮添加事件响应 (1)Action 事件 杨教授工作室 精心创作的优秀程序员 职业提升必读系列资料 杨教授工作室,版权所有,盗版必究, 5/19 页 (2)分别创建出 5 个不同的事件响应方法 5、编程 5 个不同按钮的事件响应方法的功能实现代码 StudentManageInter oneStudentManage=null; CourseManageInter oneCourseManage=null; public SystemMainWindow() { initComponents(); /** * 创建 StudentManageImple 和 CourseManageImple 的对象实例 */ oneStudentManage=new StudentManageImple(); 杨教授工作室 精心创作的优秀程序员 职业提升必读系列资料 杨教授工作室,版权所有,盗版必究, 6/19 页 oneCourseManage=new CourseManageImple(); } /** 退出系统按钮的事件响应 */ private void exitSystemButtonActionPerformed(java.awt.event.ActionEvent evt) { this.dispose(); System.exit(0); } /** 退选课程按钮的事件响应 */ private void removeCourseButtonActionPerformed( java.awt.event.ActionEvent evt) { oneCourseManage.removeOneCourse(); } /** 在线选课按钮的事件响应 */ private void selectCourseButtonActionPerformed( java.awt.event.ActionEvent evt) { oneCourseManage.addOneCourse(); } /** 系统登录按钮的事件响应 */ private void systemLoginButtonActionPerformed(java.awt.event.ActionEvent evt) { oneStudentManage.systemLogin(); 杨教授工作室 精心创作的优秀程序员 职业提升必读系列资料 杨教授工作室,版权所有,盗版必究, 7/19 页 } /** 系统注册按钮的事件响应 */ private void systemRegisterButtonActionPerformed(java.awt.event.ActionEvent evt) { oneStudentManage.systemRegister(); } 6、测试主窗口内的"退出系统"按钮的正确性 点击"退出系统"按钮后,将关闭主窗口,同时退出本系统程序。 1.1.2 课程选课系统注册窗口的 UI 实现 1、打开 Form 设计器 (1)设置包名称为 com.px1987.course.ui,类名称为 StudentRegisterWin

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值