程序-基于节点编号的通用树状菜单设计方法与实现
文件目录结构的树形显示(数据结构课程设计,树、队列,C语言描述)
⽂件⽬录结构的树形显⽰(数据结构课程设计,树、队列,C语⾔描述)⼀、要解决的问题给出某⼀个操作系统下⽬录和⽂件信息,输⼊的数据第⼀⾏为根⽬录节点。
若是⽬录节点,那么它的孩⼦节点将在第⼆⾏中被列出,同时⽤⼀对圆括号“()”界定。
同样,如果这些孩⼦节点中某⼀个也是⽬录的话,那么这个⽬录所包含的内容将在随后的⼀⾏中列出,由⼀对圆括号“()”界定。
⽬录的输⼊输⼊格式为:*name size,⽂件的输⼊输⼊格式为:name size。
Name为⼀串不超过10个字符组成,并且字符串中不能有‘(’,‘)’,‘[‘,’]’和’*’。
Size是该⽂件/⽬录的⼤⼩,⽂件的size输⼊值为该⽂件的⼤⼩,⽬录的size输⼊值都为1。
树结构最多10层,每⼀层最多2个⽂件/⽬录。
要求编程实现将其排列成⼀棵有⼀定缩进的树,输出要求:第d层的⽂件/⽬录名前⾯需要缩进8*d个空格,兄弟节点要在同⼀列上。
并计算每⼀个⽬录⼤⼩,⽬录⼤⼩为所包含的所有⼦⽬录和⽂件⼤⼩以及⾃⾝⼤⼩的总和。
例如输⼊:*/usr 1(*mark 1 *alex 1)(hw.c 3 *course 1) (hw.c 5)(aa.txt 12)输出|_*/usr[24]|_*mark[17]| |_hw.c[3]| |_*course[13]| |_aa.txt[12]|_*alex[6]|_hw.c[3]⼆、算法基本思想描述:采⽤孩⼦兄弟双亲链表的数据存储结构建⽴⼆叉树,再先序遍历该⼆叉树输出所有节点。
输出时,通过parent节点的第⼀个孩⼦是否有兄弟节点控制缩进输出” | ”或” ”;⽬录的⼤⼩为该⽬录左⼦树(以其第⼀个孩⼦为根的树)所有节点的size和加上它本⾝⼤⼩。
三、设计1. 数据结构的设计和说明在⼀开始设计要采⽤的数据结构时,虽然课题只要求“树结构最多10层(树的深度),每⼀层最多2个⽂件/⽬录”,考虑到问题的实际意义,我决定把它优化消除这⼀限制,于是采⽤孩⼦兄弟的数据结构,后来由于缩进输出的需要⼜增加了parent域。
js实现树形结构的方法
js实现树形结构的方法在Web开发中,经常需要展示树形结构的数据,比如文件目录、组织结构等。
JavaScript是一种广泛应用于Web开发的脚本语言,它提供了丰富的方法和技术来实现树形结构的展示和操作。
本文将介绍几种常用的JavaScript方法来实现树形结构,并详细说明每种方法的步骤和实现原理。
一、使用对象和数组实现树形结构1.创建一个对象,表示树的节点。
该对象包含一个value属性,用于存储节点的值;一个children属性,用于存储子节点。
2.创建一个数组,表示树的根节点。
该数组中的每个元素都是一个节点对象。
3.可以通过操作对象和数组,实现树节点的增加、删除和遍历操作。
-增加节点:创建一个新的节点对象,设置其value和children属性,然后将节点添加到指定的父节点的children数组中。
-删除节点:找到要删除的节点对象,并从其父节点的children数组中将这个节点移除。
-遍历节点:使用递归方式遍历节点,可以使用深度优先遍历或广度优先遍历方法。
下面是一个使用对象和数组实现的树形结构示例。
假设有一个组织结构树,根节点为公司,下面有多个部门,每个部门又可以有多个子部门。
每个节点的值为部门的名称。
```javascript//创建根节点var company={value:"公司",children:[]//添加子节点var department1={value:"部门1",children:[]company.children.push(department1);var department2={value:"部门2",children:[]company.children.push(department2);var subDepartment={value:"子部门",children:[]department1.children.push(subDepartment);//删除节点function removeNode(node,parentNode){var index=parentNode.children.indexOf(node);if(index!==-1){parentNode.children.splice(index,1);removeNode(subDepartment,department1);//遍历节点function traverseNode(node){console.log(node.value);for(var i=0;i<node.children.length;i++){ traverseNode(node.children[i]);traverseNode(company);以上示例通过创建对象和数组的方式实现了一个简单的树形结构,并进行了节点的增加、删除和遍历操作。
移动端实现树级菜单的方法
移动端实现树级菜单的方法全文共四篇示例,供读者参考第一篇示例:在移动端开发中,实现树级菜单是一项常见且重要的任务。
在移动设备上,由于屏幕空间有限,设计和实现树级菜单需要考虑到用户体验和界面布局的限制。
本文将介绍一些常见的方法和技巧来实现移动端的树级菜单。
一、使用折叠菜单折叠菜单是一种常见的树级菜单设计模式,适用于移动设备上的界面。
在折叠菜单中,每个父级菜单项下面可以展开或折叠多个子级菜单项,用户可以点击父级菜单项来展开或折叠子级菜单项。
这种设计模式节省了屏幕空间,并且用户可以方便地浏览和操作树状结构的数据。
在实现折叠菜单时,可以使用HTML、CSS和JavaScript来构建。
可以使用HTML的ul和li标签来表示菜单的层级结构,使用CSS样式来控制菜单的外观和布局,使用JavaScript来添加交互效果和实现菜单的展开和折叠功能。
通过合理的布局和样式设计,可以在移动设备上呈现出清晰、易用的树级菜单。
二、利用滑动菜单在实现滑动菜单时,可以利用现有的移动端UI框架或库来快速实现。
一些流行的移动端UI框架,如jQuery Mobile、Ionic等,提供了丰富的界面组件和交互效果,可以帮助开发人员快速构建滑动菜单。
通过合理的布局和交互设计,可以让滑动菜单在移动设备上呈现出流畅、直观的用户体验。
三、响应式设计在设计移动端树级菜单时,需要考虑到不同设备屏幕大小和分辨率的差异。
为了适应不同尺寸的移动设备,可以使用响应式设计的技术来实现自适应的界面布局。
通过使用CSS媒体查询和弹性布局等技术,可以让树级菜单在不同尺寸的屏幕上自动调整布局和样式,确保用户在任何设备上都能够方便地访问和操作菜单。
在移动端实现树级菜单时,需要综合考虑用户体验、界面设计和技术实现等多方面因素。
通过选择合适的设计模式、利用现有的UI框架和工具、采用响应式设计等方法,可以实现一个优秀的移动端树级菜单,为用户提供更好的导航和操作体验。
希望本文介绍的方法和技巧能够帮助开发人员更好地实现移动端树级菜单。
C#→用TreeView实现树菜单
C#→⽤TreeView实现树菜单具体⽅法是:创建⼀个数据库,设计树图信息表S_Menu,包含NodeId、ParentId、NodeName、Address、Icon字段,其它字段根据实际业务⽽定,节点名称NodeName将在树型控件的节点上显⽰,NodeId字段保存节点的唯⼀标识号,ParentId表⽰当前节点的⽗节点号,标识号组成了⼀个“链表”,记录了树上节点的结构。
设计⼀个Web窗体其上放置TreeView控件,修改其属性Id为tvMenu。
数据结构如下:CREATE TABLE [dbo].[S_Menu] ([NodeId] [char] (6) COLLATE Chinese_PRC_CI_AS NULL ,[ParentId] [char] (6) COLLATE Chinese_PRC_CI_AS NULL ,[NodeName] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,[Address] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,[Icon] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL) ON [PRIMARY]GO数据库如下:NodeId ParentId NodeName Address Icon100000 0 公共查询部 icon_document.gif100001 100000 ⼈民币⽇报查询 public/a1.aspx icon_settings.gif100002 100000 外币⽇报查询 public/a2.aspx icon_settings.gif100003 0 分⾏科技部 icon_document.gif100004 100003 ⼈民币⽇报查询 tech/a1.aspx icon_settings.gif100005 100003 外币⽇报查询 tech/a2.aspx icon_settings.gif100006 0 福⽥⽀⾏ icon_document.gif100007 100006 ⽉存款进度表 a1.aspx icon_settings.gif100008 100006 ⽉存款⾛势图 a2.aspx icon_settings.gif100009 0 罗湖⽀⾏ icon_document.gif100010 100009 ⽉存款进度表 a1.aspx icon_settings.gif100011 100009 ⽉存款⾛势图 a2.aspx icon_settings.gifmenu_left.aspx⽂件如下:<%@ Register TagPrefix="iewc" Namespace="Microsoft.Web.UI.WebControls" Assembly="Microsoft.Web.UI.WebControls, Version=1.0.2.226, Culture=neutral, PublicKeyToken=31bf3856ad364e35" %><%@ Page language="c#" Codebehind="menu_Left.aspx.cs" AutoEventWireup="false" Inherits="hzquery.menu.menu_Left" %><HTML><HEAD><title>menu_Left</title><meta name="GENERATOR" Content="Microsoft Visual Studio 7.0"><meta name="CODE_LANGUAGE" Content="C#"><meta name="vs_defaultClientScript" content="JavaScript"><meta name="vs_targetSchema" content=""></HEAD><body MS_POSITIONING="GridLayout"><form id="menu_Left" method="post" runat="server"><iewc:TreeView id="tvMenu" runat="server"></iewc:TreeView></form></body></HTML>CodeBehind代码如下:using System;using System.Collections;using ponentModel;using System.Data;using System.Drawing;using System.Web;using System.Web.SessionState;using System.Web.UI;using System.Web.UI.WebControls;using System.Web.UI.HtmlControls;using Microsoft.Web.UI.WebControls;using System.Data.SqlClient;namespace hzquery.menu{/// <summary>/// menu_Left 的摘要说明。
c#递归树形菜单
c#递归树形菜单⾸先创建模型类Menuspublic class Menus{//菜单Idpublic int Id { get; set; }//菜单名public string MenuName { get; set; }//⽗节点Idpublic int ParentId { get; set; }}窗体中放⼊button跟TreeView控件声明全局变量private static List<Menus> menus;添加按钮事件private void button1_Click(object sender, EventArgs e){menus = new List<Menus>();menus.Add(new Menus { Id = 1, MenuName = "基础设置", ParentId = 0 });menus.Add(new Menus { Id = 2, MenuName = "采购管理", ParentId = 0 });menus.Add(new Menus { Id = 3, MenuName = "系统设置", ParentId = 1 });menus.Add(new Menus { Id = 4, MenuName = "⽤户管理", ParentId = 1 });menus.Add(new Menus { Id = 5, MenuName = "采购订单", ParentId = 2 });menus.Add(new Menus { Id = 6, MenuName = "采购⼊库", ParentId = 2 });menus.Add(new Menus { Id = 7, MenuName = "⽤户", ParentId = 4 });menus.Add(new Menus { Id = 8, MenuName = "采购退货", ParentId = 2 });menus.Add(new Menus { Id = 9, MenuName = "⽤户组", ParentId = 4 });menus.Add(new Menus { Id = 10, MenuName = "权限管理", ParentId = 4 });//⾸先查出顶级菜单,循环添加IEnumerable<Menus> menu = from m in menus where m.ParentId == 0orderby m.ParentId select m; foreach (var item in menu){TreeNode node = new TreeNode();node.Tag = item;node.Text = item.MenuName;treeView1.Nodes.Add(node);//将当前节点作为参数传⼊⼦节点AddChildMenu(node);}}⼦节点递归实现private void AddChildMenu(TreeNode node){Menus menu = new Menus();menu = (Menus)node.Tag; //将⽗节点转为Model//查出当前⼦节点中所有同⽗节点Id⼀样的数据IEnumerable<Menus> childMenu = from m in menus where m.ParentId == menu.Id orderby m.Id select m; foreach (var item in childMenu){TreeNode childNode = new TreeNode();childNode.Tag = item;childNode.Text = item.MenuName;node.Nodes.Add(childNode); //添加⼦节点AddChildMenu(childNode); //递归调⽤⾃⼰,直到⽗节点添加所有⼦节点结束}}效果展⽰。
JAVA递归生成树形菜单
JAVA递归⽣成树形菜单 递归⽣成⼀个如图的菜单,编写两个类数据模型Menu、和创建树形的MenuTree。
通过以下过程实现: 1.⾸先从菜单数据中获取所有根节点。
2.为根节点建⽴次级⼦树并拼接上。
3.递归为⼦节点建⽴次级⼦树并接上,直⾄为末端节点拼接上空的“树”。
⾸先,编写数据模型Menu。
每条菜单有⾃⼰的id、⽗节点parentId、菜单名称text、菜单还拥有次级菜单children。
1import java.util.List;23public class Menu {4private String id;5private String parentId;6private String text;7private String url;8private String yxbz;9private List<Menu> children;10public Menu(String id,String parentId,String text,String url,String yxbz) {11this.id=id;12this.parentId=parentId;13this.text=text;14this.url=url;15this.yxbz=yxbz;16 }17/*省略get\set*/18 } 创建树形结构的类MenuTree。
⽅法getRootNode获取所有根节点,⽅法builTree将根节点汇总创建树形结构,buildChilTree为节点建⽴次级树并拼接上当前树,递归调⽤buildChilTree不断为当前树开枝散叶直⾄找不到新的⼦树。
完成递归,获取树形结构。
1import java.util.ArrayList;2import java.util.List;34public class MenuTree {5private List<Menu> menuList = new ArrayList<Menu>();6public MenuTree(List<Menu> menuList) {7this.menuList=menuList;8 }910//建⽴树形结构11public List<Menu> builTree(){12 List<Menu> treeMenus =new ArrayList<Menu>();13for(Menu menuNode : getRootNode()) {14 menuNode=buildChilTree(menuNode);15 treeMenus.add(menuNode);16 }17return treeMenus;18 }1920//递归,建⽴⼦树形结构21private Menu buildChilTree(Menu pNode){22 List<Menu> chilMenus =new ArrayList<Menu>();23for(Menu menuNode : menuList) {24if(menuNode.getParentId().equals(pNode.getId())) {25 chilMenus.add(buildChilTree(menuNode));26 }27 }28 pNode.setChildren(chilMenus);29return pNode;30 }3132//获取根节点33private List<Menu> getRootNode() {34 List<Menu> rootMenuLists =new ArrayList<Menu>();35for(Menu menuNode : menuList) {36if(menuNode.getParentId().equals("0")) {37 rootMenuLists.add(menuNode);38 }39 }40return rootMenuLists;41 }42 } 最后,插⼊⼀些数据试试效果。
树的实现及其应用
树的实现及其应用树(Tree)是一种非常重要的数据结构,它在计算机科学中有着广泛的应用。
树是由节点(Node)和边(Edge)组成的一种层次结构,其中一个节点可以有零个或多个子节点。
树结构中最顶层的节点称为根节点(Root),最底层的节点称为叶节点(Leaf),除了根节点外,每个节点有且仅有一个父节点。
一、树的基本概念在树的结构中,每个节点可以有多个子节点,这些子节点又可以有自己的子节点,以此类推,形成了树的层次结构。
树的基本概念包括以下几个要点:1. 根节点(Root):树结构的最顶层节点,没有父节点。
2. 叶节点(Leaf):树结构的最底层节点,没有子节点。
3. 父节点(Parent):一个节点的直接上级节点。
4. 子节点(Child):一个节点的直接下级节点。
5. 兄弟节点(Sibling):具有相同父节点的节点互为兄弟节点。
6. 子树(Subtree):树中的任意节点和它的子节点以及这些子节点的子节点构成的子树。
7. 深度(Depth):从根节点到某个节点的唯一路径的边的数量。
8. 高度(Height):从某个节点到叶节点的最长路径的边的数量。
二、树的实现树的实现可以通过多种方式来完成,其中最常见的是使用节点和指针的方式来表示树结构。
在实际编程中,可以通过定义节点类(NodeClass)来表示树的节点,然后通过指针来连接各个节点,从而构建出完整的树结构。
下面是一个简单的树节点类的示例代码:```pythonclass TreeNode:def __init__(self, value):self.value = valueself.children = []```在上面的示例中,TreeNode类表示树的节点,每个节点包含一个值(value)和一个子节点列表(children)。
通过不断地创建节点对象并将它们连接起来,就可以构建出一棵完整的树。
三、树的遍历树的遍历是指按照一定顺序访问树中的所有节点。
el-tree 树状设置样式
el-tree 树状设置样式el-tree是一个常用的树状结构的组件,它可以用来展示具有层级关系的数据。
本文将介绍el-tree的使用方法,并通过实例来展示其功能和样式设置。
## 1. el-tree的基本使用方法el-tree是基于Element UI框架开发的树状组件,使用前需先引入Element UI库,并按需引入el-tree组件。
```javascriptimport { Tree } from 'element-ui';```el-tree的基本使用方法如下:```html<template><div><el-tree:data="treeData":props="treeProps":expand-on-click-node="false"show-checkboxdefault-expand-all@check-change="handleCheckChange" ></el-tree></div></template><script>export default {data() {return {treeData: [{id: 1,label: '节点1',children: [{id: 11,label: '节点1-1'},{id: 12,label: '节点1-2'}]},{id: 2,label: '节点2',children: [{id: 21,label: '节点2-1' },{id: 22,label: '节点2-2' }]}],treeProps: {children: 'children', label: 'label'}};},methods: {handleCheckChange(data, checkedNodes) {console.log(data, checkedNodes);}}};</script>```## 2. el-tree的样式设置el-tree提供了多种样式设置选项,可以根据需要进行个性化定制。
VC实现树状菜单的XML存档
成。选择型菜单用于 目标功能的选择 , 其本身并不 执行具体的任务。功能型菜单位于菜单的最下级 ( 的叶节 点 )完成 一个 实际 的应用 功能 。本 文所 树 , 采用 的 I 十进 制编 号体 系 , 1 起始 编 号 , D是 以 为 每 屏 液晶显示屏最 多显 示 9个菜 单条 目, 单层 次结 菜
构最 多有 9层 , 以完成 大多数项 目的要求 。 可
编号方法如下 : 根节点的编号为 I1其余节点 D,
的编号为其父节点 的编号乘 以 1 , 0后 加上 此节 点在
生代码简短、 可移植性好 , 还是有一定困难。 本文介 绍在 V 6 0中通 过 C ret 控件输 入 C. TeCf l
有低功耗、 体积小、 驱动电压低、 价格低、 包含信息多
的优点 , 在嵌入式 系统 中 , 人机界面显示器 大量采用 L D 配上薄膜键盘 , C, 可方便地进行人机交互 。 虽然液 晶显示菜单 的结构 与普通 P c菜单 的结 构一致 , 型拓 扑结构 , 和 P 呈树 但 c平 台上 的 界面设 计有很大不同 , 它受嵌入式系统开发平 台的限制 , 一 般 只能 自己编写人机 界面代码 。现在通常设 计的人 机 界面的界面数多达几十个 , 高效产 生代 码 , 要 且产
杨舒毅 , 明霄, 敏 程 王
( 南京工业大学 自 动化学院 , 江苏 南京 2oo ) 1o9
摘要: 介绍在 v c中实现通用树状菜单的X L文档的存储, M 用于单片机 系统监控程序 自 动生成的平台中,
实现软件框架复用 . 高软件 开发 效率和代 码质量。 提
关键词: 树状菜单;TeC l M ; C r t; L 软件复用; C e rX V
中图分类号 : P 1 .1 文献标识码 : 文章 编号 : 0 033 ( 0 6 0 -0 80 T 3 1 1 A 10 -9 2 2 0 )20 4 -3
网络教学系统的设计与实现
网络教学系统的设计与实现陈如琪;刘帅;佟诚南【摘要】为实现网络课程学习过程的互动,使学习环境更加宽松、方便,在WINDOWS操作系统平台上设计实现了“计算机组成原理”网络课程学习系统.用户通过浏览器可以学习整个网络课程,处理教师发布的在线作业,可以维护自己的账户口令.教师通过浏览器可以管理和维护用户账号,管理和发布在线作业,管理和评定用户提交的在线作业.该系统可为学生提供自学的环境与丰富的学习资源,实现网络学习的基本功能,为教师的课堂教学提供有效的帮助.【期刊名称】《北京印刷学院学报》【年(卷),期】2013(021)002【总页数】5页(P55-59)【关键词】教学系统;CSS;学习系统;在线作业【作者】陈如琪;刘帅;佟诚南【作者单位】北京印刷学院,北京102600;北京印刷学院,北京102600;北京印刷学院,北京102600【正文语种】中文【中图分类】TP311.52随着技术的发展,利用网络进行远程教育成为教育发展的一个方向。
利用网络进行教学,师生可以突破时空界限,大大节省了教育资源,而且师生间可以实现互动,学生可以共享网络上丰富的教学资源和学习资源。
网络在线学习打破了传统学校教育的课堂授课模式,同时也突破了传统远程教育所无法实施的有效的沟通和交流的局限。
它要求建立一种全新的教学与学习模式,对教师和学生也提出了不同的要求。
因此,网络教学系统应根据新的学习、教学环境进行设计。
1 系统的总体架构设计网络教学系统的设计与开发必须充分考虑课程本身的特点,以及教学方式的特点。
网络教学系统的实现,需要对课程内容进行重新组织,使课程内容能够方便、有效地被用户访问浏览。
实现这些功能需要运用HTML技术、JavaScript技术、VBScript技术以及其他前台WEB处理技术。
另外,网络教学系统还具有教师与学生之间信息互动的功能,如在线作业、信息通告等。
“计算机组成原理”是计算机专业的基础核心课程,该课程具有知识点多、知识信息量大等特点。
pythondjango数据库树形菜单的设计
pythondjango数据库树形菜单的设计# view⽂件from django.shortcuts import renderfrom app.models import Menu# Create your views here.from django.http import JsonResponsedef index(request):data = get_menu_tree()return JsonResponse({"list":data})# 从数据库获取菜单树def get_menu_tree():tree = []menus = Menu.objects.filter(parent=None)for menu in menus:menu_data = {"label":,"children":[]}childs = Menu.objects.filter(parent=menu)if childs:menu_data["children"] = get_child_menu(childs)tree.append(menu_data)return tree# 递归获取所有的⼦菜单def get_child_menu(childs):children = []if childs:for child in childs:data = {"label":,"children":[]}_childs = Menu.objects.filter(parent=child)if _childs:data["children"].append(get_child_menu(_childs))children.append(data)return children# models.pyfrom django.db import modelsclass User(models.Model):username = models.CharField(max_length=16) #创建⼀个字段,类型为字符串类型,最⼤长度为16password = models.CharField(max_length=32) #创建⼀个字段,类型为字符串类型,最⼤长度为32def __unicode__(self):return ernameclass Menu(models.Model):name = models.CharField(max_length=64, verbose_name="菜单名称") # 菜单名称fullName = models.CharField(max_length=512, null=True, blank=True) # 菜单全称path = models.CharField(max_length=64, null=True, blank=True) # 映射数据路径parent = models.ForeignKey("Menu", on_delete=models.DO_NOTHING, null=True, blank=True) # ⽗节点datum = models.CharField(max_length=64, null=True, blank=True) # 参考基准type = models.CharField(max_length=64, null=True, blank=True) # 菜单类型remark = models.CharField(max_length=64, null=True, blank=True) # 备注def __unicode__(self):return def __str__(self):return class Meta():verbose_name = "菜单"verbose_name_plural = verbose_name。
ABAP 树型菜单程序
ABAP 树型菜单程序Jerry 项目中树型菜单很少用到,但是学会了,也是一种好事。
最近,客户方就有一个要求,能够实现特殊的文档管理,包括动态的树型菜单。
此文档中,我就介绍如何用ABAP创建一个简单的树型菜单!下面几个步骤只讲创建树型菜单几个重要的地方,最后面是详细的实现代码。
建议学者粗略看看步骤,重点看最后的代码,然后自己学着按下面的DEMO写测试程序,直到成功为止,如有不懂的地方,可以到群内留言。
或者文档有写得不好的地方,也可以提出来,我们一起加以改善!一. 创建一个DIALOG屏幕(0900),创建一个定制控制: TREE_CONTAINER,作为一个容器来存放程序创建的树型菜单,如下图所示:二. 在屏幕PBO事件中,创建一个MOUDLE: m_init_tree,然后创建一个Subroutine: frm_init_tree。
在Subroutine中创建一个Object: g_application,g_application指向自己创建的一个Class:lcl_application。
这个Class主要定义了一些事件,比如单击,双击,展开,链接单击等事件,用来注册及捕获树型菜单的父节点,子节点单击,双击,展开,链接单击等事件,然后在自己Class :lcl_application中相应自定义的Method中写相应的Code,实现特殊的操作。
三. 用程序创建一个容器类cl_gui_custom_container的实例g_custom_container,代码如下CREATE OBJECT g_custom_containerEXPORTINGcontainer_name = 'TREE_CONTAINER'EXCEPTIONScntl_error = 1cntl_system_error = 2create_error = 3lifetime_error = 4lifetime_dynpro_dynpro_link = 5.IF sy-subrc <> 0.* MESSAGE a000.ENDIF.从上面的代码可以看出,程序创建了一个指向步骤一创建的定制控制: TREE_CONTAINER一个自定义容器类.四. 设置树型菜单名称,宽度,菜单列数,并创建树型菜单Class:cl_gui_column_tree实例:g_tree,并和屏幕容器相关联hierarchy_header-heading = '资源管理'. "树型菜单名称hierarchy_header-width = 50. "宽度CREATE OBJECT g_treeEXPORTINGparent = g_custom_container "将创建的树型菜单和屏幕容器相关联 node_selection_mode = cl_gui_column_tree=>node_sel_mode_single "模式 item_selection = 'X'hierarchy_column_name = c_column-column1 "列数hierarchy_header = hierarchy_headerEXCEPTIONScntl_system_error = 1create_error = 2failed = 3illegal_node_selection_mode = 4illegal_column_name = 5lifetime_error = 6.IF sy-subrc <> 0.* MESSAGE a000.ENDIF.五. 定义树型菜单的一些事件,比如单击,双击等" node double click根节点双击event-eventid = cl_gui_column_tree=>eventid_node_double_click.event-appl_event = 'X'. " process PAI if event occursAPPEND event TO events." item double click子节点双击event-eventid = cl_gui_column_tree=>eventid_item_double_click.event-appl_event = 'X'.APPEND event TO events." expand no children展开文件event-eventid = cl_gui_column_tree=>eventid_expand_no_children.event-appl_event = 'X'.APPEND event TO events." link click链接单击,我认为是最后的子节点单击event-eventid = cl_gui_column_tree=>eventid_link_click.event-appl_event = 'X'.APPEND event TO events." button clickevent-eventid = cl_gui_column_tree=>eventid_button_click.event-appl_event = 'X'.APPEND event TO events." checkbox changeevent-eventid = cl_gui_column_tree=>eventid_checkbox_change.event-appl_event = 'X'.APPEND event TO events." header clickevent-eventid = cl_gui_column_tree=>eventid_header_click.event-appl_event = 'X'.APPEND event TO events.设置类实例g_tree的相关事件,因为类g_tree的属性event默认为空,所以在这里要调用set_registered_events设置事件CALL METHOD g_tree->set_registered_eventsEXPORTINGevents = eventsEXCEPTIONScntl_error = 1cntl_system_error = 2illegal_event_combination = 3.IF sy-subrc <> 0.* MESSAGE a000.ENDIF.六. 注册树型菜单事件到第二步中创建的类lcl_application的实例g_application,然后我们就可以在g_application中相关的方法中捕获树型菜单的相关事件,写自己的程序作特殊的处理。
单片机多级菜单编程实现(ZT)建立一个树状的菜单结构,用链表实现
单片机多级菜单编程实现(ZT) 建立一个树状的菜单结构,用链表实现链表中包含:1、指向同级左右菜单和指向父菜单、子菜单的四个菜单结构体指针;2、进入该菜单时需要执行的初始化函数指针3、退出该菜单时需要执行的结束函数指针4、该菜单内的按键处理函数指针数组的指针操作菜单模块需要的按键操作有:左、右、确认、退出。
采用这种办法,可以方便的添加或删减菜单。
并且只需要在其头文件中修改初始变量就可以实现,完全无须修改C文件中的任何函数。
具体结构定义我的定义,做个参考:#define MENU_HLP_EN 菜单帮助信息使能typedef struct{void (pMenuTaskInit)(void); 指向菜单任务初始化函数的指针void (pMenuTaskEnd)(void); 指向菜单任务结束函数的指针}MENU_TASK_TYP;typedef struct MenuTyp{INT8U MenuName; 菜单名称字符串WORK_MOD WorkMod; 工作状态编号MENU_TASK_TYP pMenuTask; 指向菜单任务的指针void (pTaskKeyDeal)(void); 指向菜单任务按键处理函数数组的指针#ifdef MENU_HLP_ENINT8U MenuHlp; 菜单帮助字符串#endifstruct MenuTyp pParent; 指向上层菜单的指针struct MenuTyp pChild; 指向子菜单的指针struct MenuTyp pRight; 指向右菜单的指针struct MenuTyp pLeft; 指向左菜单的指针}MENU_TYP;我根据网上的资料做的一个菜单:菜单数据结构struct KeyTabStruct{uint8 MenuIndex; 当前状态索引号uint8 MaxItems; 本级菜单最大条目数uint8 ShowLevel; 菜单显示内容uint8 PressOk; 按下回车键时转向的状态索引号uint8 PressEsc; 按下返回键时转向的状态索引号uint8 PressDown; 按下向下键时转向的状态索引号uint8 PressUp; 按下向上键时转向的状态索引号void (CurrentOperate)(); 当前状态应该执行的功能操作};uint8 MenuID; 菜单ID号uint8 MenuNextID; 下级菜单ID号CurMenuID=本菜单IDMaxMenuItem=同级菜单最大项数OkMenuID=子菜单层所对应的菜单ID,ID=999为菜单已经到底了EscMenuID=父菜单层所对应的菜单ID,ID=999为菜单已经到顶了DownMenuID=弟菜单层所对应的菜单ID,ID=999为菜单是独生子UpMenuID=兄菜单层所对应的菜单ID,ID=999为菜单是独生子CurFunction=本菜单所对应的菜单函数指针const struct KeyTabStruct KeyTab[MAX_KEYTABSTRUCT_NUM]={CurMenuID, axMenuItem, MenuShowLevel, OkMenuID, EscMenuID, DownMenuID, UpMenuID, CurFunction{MENU_EDIT, 0, 0, MENU_DA TA_VIEW, MENU_NO, MENU_NO, MENU_NO, MenuEdit}, {MENU_DA TA_VIEW, 3, 1, MENU_DA TA_VIEW_FIRE, MENU_EDIT, MENU_SYS_EDIT, MENU_PRINT_DA TA,MenuEdit},{MENU_DA TA_VIEW_FIRE, 5, MENU_NO, MENU_NO, MENU_DA TA_VIEW, MENU_DA TA_VIEW_TROUBLE, MENU_STEP_FOLLOW, MenuDataViewIn},{MENU_DA TA_VIEW_TROUBLE, 5, MENU_NO, MENU_NO, MENU_DA TA_VIEW, MENU_DA TA_VIEW_REPEA T, MENU_DA TA_VIEW_FIRE, MenuDataViewIn},{MENU_DA TA_VIEW_REPEA T, 5, MENU_NO,MENU_NO, MENU_DA TA_VIEW, MENU_FACE_CHECK, MENU_DA TA_VIEW_TROUBLE, MenuDataV iewIn},{MENU_FACE_CHECK, 5, MENU_NO,MENU_NO, MENU_DA TA_VIEW, MENU_STEP_FOLLOW,MENU_DA TA_VIEW_REPEA T, MenuFaceCheck},{MENU_STEP_FOLLOW, 5, MENU_NO,MENU_NO, MENU_DA TA_VIEW, MENU_DA TA_VIEW_FIRE, MENU_FACE_CHECK,MenuStepFollow},{MENU_SYS_EDIT, 3,2, MENU_SUM_SET, MENU_EDIT,MENU_PRINT_DA TA, MENU_DA TA_VIEW, MenuEdit}, {MENU_SUM_SET, 6, MENU_NO,MENU_NO, MENU_SYS_EDIT, MENU_EDIT_INSULA TE,MENU_TIME_SET, MenuSumSet},{MENU_EDIT_INSULA TE, 6, MENU_NO,MENU_NO, MENU_SYS_EDIT, MENU_EDIT_HZ, MENU_SUM_SET,MenuEditInsulate},{MENU_EDIT_HZ, 6, MENU_NO,MENU_NO, MENU_SYS_EDIT, MENU_LD_CONTROL,MENU_EDIT_INSULA TE, MenuEditHZ},{MENU_LD_CONTROL, 6,MENU_NO, MENU_NO, MENU_SYS_EDIT, MENU_LD_DELAY,MENU_EDIT_HZ, MenuLDControl},{MENU_LD_DELAY, 6,MENU_NO, MENU_NO, MENU_SYS_EDIT, MENU_TIME_SET,MENU_LD_CONTROL, MenuLDDelay},{MENU_TIME_SET, 6, MENU_NO,MENU_NO, MENU_SYS_EDIT, MENU_SUM_SET, MENU_LD_DELAY,MenuTimeSet},{MENU_PRINT_DA TA, 3, 3,MENU_PRINT_DA TA_FIRE, MENU_EDIT, MENU_DA TA_VIEW, MENU_SYS_EDIT, MenuEdit},{MENU_PRINT_DA TA_FIRE, 4,MENU_NO, MENU_NO, MENU_PRINT_DA TA,MENU_PRINT_DA TA_TROUBLE, MENU_PRINT_SET, MenuPrintDataIn}, {MENU_PRINT_DA TA_TROUBLE, 4, MENU_NO,MENU_NO, MENU_PRINT_DA TA, MENU_PRINTER_CHECK,MENU_PRINT_DA TA_FIRE, MenuPrintDataIn},{MENU_PRINTER_CHECK, 4, MENU_NO,MENU_NO, MENU_PRINT_DA TA, MENU_PRINT_SET,MENU_PRINT_DA TA_TROUBLE, MenuPrintDataIn},{MENU_PRINT_SET, 4, MENU_NO,MENU_NO, MENU_PRINT_DA TA, MENU_PRINT_DA TA_FIRE, MENU_PRINTER_CHECK, MenuPrintSet},};编程菜单显示数据const struct MenuDispData MenuEditShow[][MENU_MAX] = {{{MENU_NO , 0, 0, 选择消音→退出}, 主菜单{MENU_DA TA_VIEW , 1, 6, ⒈数据查看},{MENU_SYS_EDIT , 2, 6, ⒉系统编程},{MENU_PRINT_DA TA, 3, 6, ⒊数据打印}},{{MENU_NO , 0, 0, 数据查看消音→退出}, 数据查看{MENU_DA TA_VIEW_FIRE , 1, 4, ⒈火警},{MENU_DA TA_VIEW_TROUBLE, 2, 4, ⒉故障},{MENU_DA TA_VIEW_REPEA T , 3, 4, ⒊重码},{MENU_FACE_CHECK , 1,12, ⒋面板检测},{MENU_STEP_FOLLOW , 2,12, ⒌单步跟踪}},{{MENU_NO , 0, 0, 系统编程消音→退出}, 系统编程{MENU_SUM_SET , 1, 0, ⒈容量设置},{MENU_EDIT_INSULA TE , 2, 0, ⒉隔离点},{MENU_EDIT_HZ , 3, 0, ⒊汉字描述},{MENU_LD_CONTROL , 1,12, ⒋联动控制},{MENU_LD_DELAY, 2,12, ⒌模块延时},{MENU_TIME_SET , 3,12, ⒍时钟调整}},{{MENU_NO , 0, 0, 数据打印消音→退出}, 数据打印{MENU_PRINT_DA TA_FIRE , 1, 0, ⒈火警数据},{MENU_PRINT_DA TA_TROUBLE,2, 0, ⒉故障数据},{MENU_PRINTER_CHECK , 3, 0, ⒊打印机自检},{MENU_PRINT_SET , 1,12, ⒋打印设置}},};等待按键void WaitKey(void){uint32 time;time = RTCFlag;WhichKey = KEY_NONE;while(!EscFlag){if(RTCFlag - time = EDIT_TIME)EscFlag = TRUE;if(WhichKey != KEY_NONE){KeySound(300); 按键音return;}}}显示多级菜单void MenuEdit(){uint32 i,j=0;uint32 oldid;j = KeyTab[MenuID].ShowLevel;if(WhichKey == KEY_ESC WhichKey == KEY_OK){ClearScreen();for(i=0;iKeyTab[MenuNextID].MaxItems+1;i++)ShowString(MenuEditShow[j][i].Lin,MenuEditShow[j] [i].Column,MenuEditShow[j][i].Pdata,0); 初始化显示oldid =0;没有原先选择的项}else{if(WhichKey == KEY_UP)oldid = KeyTab[MenuNextID].PressDown;elseoldid = KeyTab[MenuNextID].PressUp;指示原先的项}for(i=1;iKeyTab[MenuNextID].MaxItems+1;i++){if(MenuEditShow[j][i].Id == oldid)ShowString(MenuEditShow[j][i].Lin,MenuEditShow[j] [i].Column,MenuEditShow[j][i].Pdata,0); 正常显示原先的项else{if(MenuEditShow[j][i].Id == MenuNextID)ShowString(MenuEditShow[j][i].Lin,MenuEditShow [j][i].Column,MenuEditShow[j][i].Pdata,1); 反显当前选择的项}}WhichKey = KEY_NONE;}系统编程uint32 Edit(void){struct KeyTabStruct NowKeyTab; 指示当前的菜单值uint32 escflag = FALSE;ResetFlag = FALSE;ChangeFlag = FALSE;EscFlag = FALSE;MenuID = MENU_EDIT;NowKeyTab = KeyTab[MenuID];MenuNextID = NowKeyTab.PressOk;(NowKeyTab.CurrentOperate)(); 显示主菜单do{if(WhichKey == KEY_NONE)WaitKey(); 等待按键switch(WhichKey){case KEY_ESC if(NowKeyTab.PressEsc != MENU_NO) {MenuID =NowKeyTab.PressEsc;MenuNextID =NowKeyTab.MenuIndex;NowKeyTab = KeyTab[MenuID];NowKeyTab.PressOk =MenuNextID;(NowKeyTab.CurrentOperate) (); 显示当前菜单}elseescflag =TRUE; 退出编程状态break;case KEY_OK if(NowKeyTab.PressOk != MENU_NO){MenuID =NowKeyTab.PressOk;NowKeyTab = KeyTab[MenuID];MenuNextID =NowKeyTab.PressOk;}(NowKeyTab.CurrentOperate)(); 执行当前按键的操作break;case KEY_UP if((MenuNextID != MENU_NO) && (KeyTab[MenuNextID].PressUp != MENU_NO)){NowKeyTab.PressOk =KeyTab[MenuNextID].PressUp;MenuNextID = KeyTab[MenuNextID].PressUp;(NowKeyTab.CurrentOperate)(); 执行当前按键的操作}break;case KEY_DOWN if((MenuNextID != MENU_NO) && (KeyTab[MenuNextID].PressDown != MENU_NO)){NowKeyTab.PressOk =KeyTab[MenuNextID].PressDown;MenuNextID = KeyTab[MenuNextID].PressDown;(NowKeyTab.CurrentOperate)(); 执行当前按键的操作}break;case KEY_RESET ResetFlag = TRUE;break;default break;}}while(!ResetFlag && !EscFlag && !escflag);if(ChangeFlag && !EscFlag && !ResetFlag)EditDataChange();if(ResetFlag)return SYS_RESET;else{return 0;}}关于这个菜单的说明:1.我用的是ARM处理器,所以51的时候把const改成code,uint32改成unsigned char。
使用js简单实现了tree树菜单
使⽤js简单实现了tree树菜单复制代码代码如下:<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>tree</title><link href="css/style.css" rel="stylesheet" type="text/css" /><style type="text/css">.node ul{margin-left:20px;}.node .node{display:none;}.node .tree{height:24px;line-height:24px;}.ce_ceng_close{background:url(images/cd_zd1.png) left center no-repeat;padding-left: 15px;}.ce_ceng_open{background:url(images/cd_zd.png) left center no-repeat;}</style><script type="text/javascript" src="/jquery-1.10.2.min.js"></script></head><body><div class="cd_zj_l"><div class="cd_title">⽬录导航</div><div class="cv_fcv node"><div class="tree">哲学、宗教</div><ul class="node"><li><div class="tree">哲学伦理</div><ul class="node"><li><div class="tree">马克思主义哲学</div><div class="tree">马克思主义哲学</div><div class="tree">马克思主义哲学</div><div class="tree">马克思主义哲学</div></li><div style="clear:both"></div></ul></li><div style="clear:both"></div></ul><div class="tree">哲学、宗教</div><ul class="node"><li><div class="tree">哲学伦理</div><ul class="node"><li><div class="tree">马克思主义哲学</div><div class="tree">马克思主义哲学</div><div class="tree">马克思主义哲学</div><div class="tree">马克思主义哲学</div></li></ul></li></ul></div></div><script type="text/javascript">$(".tree").each(function(index, element) {if($(this).next(".node").length>0){$(this).addClass("ce_ceng_close");}});$(".tree").click(function(e){var ul = $(this).next(".node");if(ul.css("display")=="none"){ul.slideDown();$(this).addClass("ce_ceng_open");ul.find(".ce_ceng_close").removeClass("ce_ceng_open"); }else{ul.slideUp();$(this).removeClass("ce_ceng_open");ul.find(".node").slideUp();ul.find(".ce_ceng_close").removeClass("ce_ceng_open"); }});</script></body></html>使⽤js简单实现了树菜单!相信⾃⼰你⼀定可以实现的更好!实现的效果图。
软件工程的程序设计方法与流程
软件工程的程序设计方法与流程软件工程是指对软件开发过程的规范化管理和控制,以及应用工程原理、方法和工具的技术体系。
在软件工程中,程序设计是其中非常重要的环节,它涵盖了程序逻辑的设计、编码实现和测试验证等方面。
在本文中,我们将探讨软件工程的程序设计方法与流程,以期为软件开发人员提供一些参考和指导。
一、程序设计方法的选择在软件工程中,选择合适的程序设计方法是非常关键的,不同的程序设计方法适用于不同的开发场景和需求。
常见的程序设计方法包括结构化程序设计、面向对象程序设计、面向服务程序设计等。
1. 结构化程序设计结构化程序设计是一种基于模块化设计思想的方法,通过划分功能模块、确定模块之间的调用关系,从而实现整个程序的设计与实现。
结构化程序设计具有模块化、可维护性强等特点,适用于需求稳定、功能模块明确的项目。
2. 面向对象程序设计面向对象程序设计(Object-Oriented Programming,简称OOP)是一种将现实世界的实体抽象成对象,并通过对象之间的交互来实现程序设计的方法。
面向对象程序设计具有封装性、继承性、多态性等特点,适用于需求易变、功能复杂的项目。
3. 面向服务程序设计面向服务程序设计(Service-Oriented Programming,简称SOP)是一种以服务为中心的程序设计方法,它将功能模块封装成独立的服务,通过服务之间的调用与组合来完成目标功能。
面向服务程序设计具有松耦合、可重用性强等特点,适用于需要实现多个服务集成的项目。
二、程序设计流程的规划除了选择适合的程序设计方法外,合理规划程序设计流程也是软件工程中的重要一环。
一个好的程序设计流程可以提高开发效率、降低错误率,从而保证项目的顺利进行。
1. 需求分析在程序设计之前,首先需要进行需求分析,明确软件的功能需求和性能需求。
通过与客户或需求方的沟通,了解用户的真实需求,并进行需求调研和需求文档的编写。
2. 系统设计系统设计是根据需求分析的结果,对系统进行整体的设计和规划。
pyqt6树形结构经典案例
pyqt6树形结构经典案例PyQt6树形结构经典案例1. 文件资源管理器文件资源管理器是一种常见的树形结构应用,它可以展示计算机中的文件和文件夹的层级关系。
用户可以通过点击文件夹展开或折叠其子文件夹,以便查看和管理文件。
2. 组织机构架构图在企业或组织中,通常会有一个组织机构架构图,用于展示不同部门、职位和员工之间的关系。
树形结构可以清晰地展示出上下级关系和职能划分。
3. 目录索引树形结构可以用于构建目录索引,比如图书馆的图书分类索引、网站的网页目录等。
用户可以通过点击节点展开或折叠子节点,以便快速查找所需信息。
4. 任务管理器任务管理器可以使用树形结构展示系统中运行的进程和线程的层级关系。
用户可以通过点击节点查看进程的详细信息,并进行操作,如结束进程、调整优先级等。
5. 菜单导航在许多应用程序中,树形结构可用于实现菜单导航功能。
用户可以通过点击菜单项展开或折叠子菜单,以便快速导航到所需的功能模块。
6. 组织架构图树形结构可以用于展示公司或组织的组织架构图,包括各个部门、岗位和员工之间的关系。
用户可以通过点击节点查看员工的详细信息,如联系方式、职责等。
7. 文件系统浏览器文件系统浏览器是一种常见的树形结构应用,它可以展示计算机文件系统中的文件和文件夹的层级关系。
用户可以通过点击文件夹展开或折叠其子文件夹,以便浏览和管理文件。
8. 图书分类管理在图书馆或书店中,树形结构可用于图书分类管理。
每个节点代表一个图书分类,用户可以通过点击节点展开或折叠子分类,以便查找和管理图书。
9. 文件夹同步工具文件夹同步工具可以使用树形结构展示两个文件夹之间的同步关系。
用户可以通过点击节点选择要同步的文件夹,并设置同步规则和选项。
10. 知识管理系统知识管理系统可以使用树形结构展示知识库的组织和分类。
每个节点代表一个主题或类别,用户可以通过点击节点查看相关的知识内容。
总结:以上是基于PyQt6的树形结构经典案例。
这些案例涵盖了不同领域的应用,如文件管理、组织架构、任务管理、菜单导航等。
多叉树结合JavaScript树形控件实现无限级树形菜单(一种构建多级有序树形结构JSON(或XML)数据源的方法)
多叉树结合JavaScript树形控件实现无限级树形菜单(一种构建多级有序树形结构JSON(或XML)数据源的方法)一、问题研究的背景和意义在Web应用程序开发领域,基于AJAX技术的JavaScript树形控件已经被广泛使用,它用来在Html页面上展现具有层次结构的数据项。
目前市场上常见的JavaScript框架及组件库中均包含自己的树形控件,例如JQuery、Dojo、Yahoo UI、Ext JS等,还有一些独立的树形控件,例如dhtmlxtree等,这些树形控件完美的解决了层次数据的展示问题。
展示离不开数据,树形控件主要利用AJAX技术从服务器端获取数据源,数据源的格式主要包括JSON、XML等,而这些层次数据一般都存储在数据库中。
“无限级树形菜单”,顾名思义,没有级别的限制,它的数据通常来自数据库中的无限级层次数据,这种数据的存储表通常包括id和parentId这两个字段,以此来表示数据之间的层次关系。
现在问题来了,既然树形控件的数据源采用JSON或XML等格式的字符串来组织层次数据,而层次数据又存储在数据库的表中,那么如何建立起树形控件与层次数据之间的关系,换句话说,如何将数据库中的层次数据转换成对应的层次结构的JSON或XML格式的字符串,返回给客户端的JavaScript 树形控件?这就是我们要解决的关键技术问题。
本文将以目前市场上比较火热的Ext JS框架为例,讲述实现无限级树形菜单的方法,该方法同样适用于其它类似的JS树形控件。
Ext JS框架是富客户端开发中出类拔萃的框架之一。
在Ext的UI控件中,树形控件无疑是最为常用的控件之一,它用来实现树形结构的菜单。
TreeNode用来实现静态的树形菜单,AsyncTreeNode用来实现动态的异步加载树形菜单,后者最为常用,它通过接收服务器端返回来的JSON格式的数据,动态生成树形菜单节点。
动态生成树有两种思路:一种是一次性生成全部树节点,另一种是逐级加载树节点(利用AJAX,每次点击节点时查询下一级节点)。
struts实现java树形菜单(使用dtree)
在上一篇文章中介绍JavaScript实现级联下拉菜单的例子,本篇继续介绍一个利用现存的JavaScript代码配合struts构成一个树型菜单的例子。
大家知道,树型菜单在应用中有着十分广泛的用途。
实现树型菜单的途径较多,本文介绍的一种觉得理解起来比较直观,与上篇文章的方法比较类似:就是将树型菜单的节点保存在数据库表中(当然,在实际项目中,节点的信息往往并不是放在一个单一的表中的。
比如:在一个权限管理系统中,这些信息可能分别放在用户表、角色表、功能表等表中,只要设法让查询出来的结果与下面给出的表格的内容相似就可以了。
只要稍微有些数据库方面的知识做到这点并不难,详细的实现细节超出了本文的主题,不在此细说)。
通过数据访问对象将其从数据库中查出后放在一个集合对象中,并将该集合对象传递给客户端,再用一段现存的JavaScript代码--dtree(一个免费的JavaScript程序)来操作集合中的数据。
大方向确定之后,我们就来具体着手来实现它。
根据dtree的要求,我们来建一个数据库表来存储树的节点信息,表名为functions,其结构如下:在表中输入如下一些记录以供后面的实验用:到此,数据库方面的准备工作就告一段落。
接下来的工作我们仍然在先前介绍的mystruts项目中进行。
先编写一个名为:FunctionsForm 的ActionForm,其代码如下:因为我们的树型节点的数据都存储在数据库表中,接下来,要做一个数据访问对象类,名称为:FunctionsDao.java,其代码如下:这里值得注意的是:在以往我们见到的一些显示树型菜单的程序,如:一些asp程序中往往简单地采用递归调用的方法来查找到树的各个节点。
这对那些树的深度不确定的场合还是有些用处,但这种处理方法也有一个致命的弱点,那就是反复地进行数据库查询,对一些节点较多的应用,对应用程序性能的影响是非常大的,有时会慢得让人难以接受;而在实际的应用中大多数情况下树的深度往往是有限的,如:用于会计科目的树一般最多也在六层以下。
java生成树形结构的方法
java生成树形结构的方法Java是一种广泛使用的编程语言,在Java中生成树形结构是一项常见的任务。
树形结构是一种层次化的数据结构,由节点和边组成,节点之间的关系呈现出父子关系。
在Java中,可以使用多种方法来生成树形结构,下面将介绍几种常见的方法。
一、使用节点类和边类生成树形结构1. 首先定义一个节点类,节点类包含节点的值和子节点列表。
节点类的定义如下:```javapublic class TreeNode {private int value;private List<TreeNode> children;public TreeNode(int value) {this.value = value;children = new ArrayList<>();}public int getValue() {return value;}public List<TreeNode> getChildren() {return children;}public void addChild(TreeNode child) {children.add(child);}}```2. 然后定义一个边类,边类包含父节点和子节点。
边类的定义如下:```javapublic class TreeEdge {private TreeNode parent;private TreeNode child;public TreeEdge(TreeNode parent, TreeNode child) {this.parent = parent;this.child = child;}public TreeNode getParent() {return parent;}public TreeNode getChild() {return child;}}```3. 最后,使用节点类和边类来生成树形结构。
在PHP中树状导航菜单
在PHP中树状导航菜单实例说明树形结构能够以层次形式展示信息,用它来描述具有上下级关系的内容再恰当不过。
本实例利用菜单的树形结构来描述企业的人事组织结构。
关键技术本实例中实现菜单的树形显示是通过<table>标签结合DIV实现的。
父节点利用表格来显示,子节点利用DIV嵌套表格来实现。
这样做的目的是容易对子节点的显示和隐蔽进行控制。
例如,当用户单击父节点时,如果子节点没有展开,将DIV设置为可见就显示子节点;如果子节点可见,将DIV设置为不可见就可以隐蔽子节点。
设计过程(1)使用Dreamweaver创建一个PHP动态页,保存为index.php文件。
(2)创建一个表单,在表单中添加一个2行1列的表格,在表格的第2行再添加一个2行2列的表格。
表格的第1列用于显示节点前的图标,第2列描述节点文本,主要代码如下:<form id="form1"name="form1"method="post"action=""> <tablewidth="372" border="1"align="center"bgcolor="#E6F2F2"bord ercolor="#478D8D"style="border-style:none"cellspacing="0"><tr><td scope="col"align="center"style="border-bottom-style:none">人事组织架构</td></tr><tr><td><tablewidth="100%" border="0"cellpadding="0"cellspacing="0"align ="left"><?php //嵌入PHP脚本$xml_file=simplexm1_load_file("org.xm1"); //从XML文件中加载节点foreach($xm1_file->children() as $node){ //遍历根节点><tr><tdwidth="38%"align="right"> //设置节点图标<imgsrc="images/rootnode.gif"width="15"height="15"border="0"> </img></td><td width="62%" left="0px"align="left"><a href="#"onclick="ShowNode(<?php echo $node?>)"> <?php echo $node?></a></td></tr><tr><td width="38%"align="center"></td><td width="62%"><div id=<?php echo $node?>style="display:none"class="HideDiv"> //定义DIV<tablewidth="100%"border="0"cellpadding="0"cellspacing="0"align= "left"><?phpforeach($node->chidren() as $value){ //遍历字节点><tr><td width="10%" align="right"><imgsrc="images/childnode.gif"width="15"height="15"border="0"> </img></td><td width="90%" align="left" ><a href="#"> <?php echo $value?></a></td></tr><?php}></table></div></td></tr><?php}></table></td></tr></table><script language="javascript"> //隐蔽或显示字节点function ShowNode(ParentID){var Div=ParentID;if(Div.style.display=="none"){Div.style.display="block"; //显示DIV,以此来显示字节点}else.if(Div.style.display=="block"){ //隐蔽DIV,间接隐蔽字节点Div.style.display="none";}}</script></form>(3)人事组织的架构存储于XML文件org.xml中。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
附录:基于节点编号的通用树状菜单设计源代码 说明: 本例实现了 TC20 的界面菜单,代码开发实现环境为 TC20。共 2 个文件: 1:memu.c-代码文件; 2:menu.h -菜单节点定义的头文件 1:memu.c -C 代码文件 /* This menu select demo programing, It define menu as binary tree, * Menu data is from TC20 software'menu. * By Peng liangqing * data:2001-9-26 */ #include<stdio.h> #include<graphics.h> #include<conio.h> #include<process.h> #include<stdlib.h> #include<menu.h> void initmenutree(void); MENU *getpmenumfromID(int id); void menuwindisplay(MENU *pmenu); MENU *menuselect(MENU *pmenu,int key); void delmenuwin(MENU *pmenu); void menucurdisplay(MENU *pmenu, int i); void delmenucur(MENU *pmenu, int i); /* 以下为功能菜单节点函数原型定义 */ void fmenu111(void); void fmenu112(void); void fmenu114(void); void fmenu115(void); void fmenu117(void); void fmenu118(void); void fmenu12(void); void fmenu14(void); void fmenu16(void); void fmenu17(void); void fmenu131(void); void fmenu132(void); void fmenu134(void); void fmenu135(void); void fmenu141(void); void fmenu142(void); void fmenu144(void); void fmenu145(void); void fmenu151(void); void fmenu152(void); void fmenu154(void); void fmenu155(void); void fmenuprocess(void);
单片机与嵌入式系统应用杂志-2002 年第 9 期
*getpmenumfromID(int id)
基于节点编号的通用树状菜单设计方法与实现
textcolor(FRIST_ALPHA_COLOR); textcolor(pmenu->wcolor); }; }
putch( pmenu->name[i][0]); cputs( (pmenu->name[i])+1);
void menucurdisplay(MENU *pmenu, int cur) { window(pmenu->x0,pmenu->y0,pmenu->x0+pmenu->width,pmenu->y0+pmenu->high); if(pmenu->dir==XDIR) gotoxy(cur*(pmenu->width/pmenu->total), 1); else gotoxy(2,cur+1+1); textbackground(pmenu->wcolor); textcolor(pmenu->bcolor); cputs( pmenu->name[cur]); } void delmenucur(MENU *pmenu, int cur) { window(pmenu->x0,pmenu->y0,pmenu->x0+pmenu->width,pmenu->y0+pmenu->high); if(pmenu->dir==XDIR) gotoxy( cur*(pmenu->width/pmenu->total), 1); else gotoxy(2,cur+1+1); textbackground(pmenu->bcolor); textcolor(FRIST_ALPHA_COLOR); putch( pmenu->name[cur][0]); textcolor(pmenu->wcolor); cputs( (pmenu->name[cur])+1); } MENU *menuselect(MENU *pmenu, int key) { int cur,i; switch(key) { case RIGHT_KEY: if (pmenu->dir==YDIR)break; delmenucur(pmenu, pmenu->cur++); if ( pmenu->cur == pmenu->total ) pmenu->cur=0; menucurdisplay(pmenu, pmenu->cur);
MENU *pmenu; void main(void) { int key, i;
textmode(C80); textbackground(WHITE); clrscr(); window(1,2,80,25); textbackground(WINDOW_BACK_COLOR); window(1,25,80,25); textbackground(WHITE); clrscr(); initmenutree( ); pmenu=&menus[0]; menuwindisplay(pmenu); menucurdisplay(pmenu,pmenu->cur); while(1) { key=getch(); pmenu=menuselect(pmenu,key); if (pmenu->total> 1 ) continue; i=0; do { if(FunTab[i].MenuID==pmenu->ID) break; i++;
单片机与嵌入式系统应用杂志-2002 年第 9 期
基于节点编号的通用树状菜单设计方法与实现
break; case LEFT_KEY: if (pmenu->dir==YDIR)break; delmenucur(pmenu, pmenu->cur--); if ( pmenu->cur < 0 ) pmenu->cur=pmenu->total-1; menucurdisplay(pmenu, pmenu->cur); break; case UP_KEY: if (pmenu->dir==XDIR) break; delmenucur(pmenu, pmenu->cur--); if ( pmenu->cur < 0 ) pmenu->cur=pmenu->total-1; menucurdisplay(pmenu, pmenu->cur); break; case DOWN_KEY: if (pmenu->dir==XDIR)break; delmenucur(pmenu, pmenu->cur++); if ( pmenu->cur == pmenu->total ) pmenu->cur=0; menucurdisplay(pmenu, pmenu->cur); break; case ENTER_KEY: cur=pmenu->cur; pmenu=pmenu->down; for(i=0; i<cur; i++) pmenu=pmenu->right; if( pmenu->total>1 ) { pmenu->cur = 0; menuwindisplay(pmenu); menucurdisplay(pmenu, pmenu->cur); }; break; case ESC_KEY: if( pmenu->up!=NULL) { delmenuwin(pmenu); pmenu=pmenu->up; }; break; default: ; }; return(pmenu); } /* 以下为功能菜单节点 */ void fmenu111(void){ fmenuprocess(); } void fmenu112(void){ fmenuprocess(); } void fmenu113(void){ fmenuprocess(); } void fmenu114(void){ fmenuprocess(); } void fmenu115(void){ fmenuprocess(); } void fmenu116(void){ fmenuprocess(); } void fmenu117(void){ fmenuprocess(); } void fmenu118(void){ fmenuprocess(); }
单片机与嵌入式系统应用杂志-2002 年第法与实现
struct function_menu_table { int MenuID; void ( *pfmenu)(void); } FunTab[]= { 111,fmenu111, 112,fmenu112, 113,fmenu113, 114,fmenu114, 115,fmenu115, 116,fmenu116, 117,fmenu117, 118,fmenu118, 119,fmenu119, 12, fmenu12, 14, fmenu14, 141,fmenu141, 142,fmenu142, 143,fmenu143, 144,fmenu144, 145,fmenu145, 146,fmenu146, 15, fmenu15, 151,fmenu151, 152,fmenu152, 153,fmenu153, 154,fmenu154, 155,fmenu155, 16, fmenu16, 17, fmenu17, 18, fmenu18, 131,fmenu131, 132,fmenu132, 133,fmenu133, 134,fmenu134, 135,fmenu135, 136,fmenu136, -1,NULL, };