这是本人的学习笔记,内容比较简单,没太多铺垫,直接上思路和代码,希望给需要的人一点思路吧。
说明 按照实际业务需求,一般需要把有逻辑关系的三层或者多层对象组织起来,构建一棵树,架构清晰,意图明确,一般用于作为导航栏,菜单列表。
设计思路:假设三个有关系的类 国家,城市,人员
1.数据库设计
国家,城市,人员,下级元素,必须有上级元素的id,parentId
2.定义实体类
普通类基础上,让三个类都实现树节点接口,接口提供树操作常用的方法。比如设置节点名称,节点对象数据,设置节点名称,节点上设置对象(JFace/swt的树有这种功能
,其他的看情况,有的话,会很方便,构架树的时候,每个节点上很方便就获取当前选择的对象,进行类类型判断,就可以转换为对应明确的类实体对象!)。必须有的功能就是设置和获取
下级节点!!
除了最底层节点类不用实现设置下级节点,其他都要实现这个方法,不实现意思是,设置null就可以。
具体参考代码
3.构架树数据准备
第一次查询数据表获取国家数据集合A,遍历A,分别查询城市数据表获取城市数据集,包装下级数据集,为国家对象设置下级节点数据集,第三阶段查询每个城市的人员表
,吧人员数据包装给城市设置下级节点数据集。
4.组件渲染数据集合
树组件有数据解析渲染方法,这些方法的参数一般都是节点接口,可以接受各层节点对象进行解析和渲染。具体参考代码。
分析一下代码1:
public class TreeViewerLableProvider implements ILabelProvider {
// 结点显示的文字。不能返回null值
// 创建几个图像
private Image[] images = new Image[] {
new Image(null, "icons/refresh.gif"),
new Image(null, "icons/star.jpg"),
new Image(null, "icons/moon.jpg") };
public String getText(Object element) {
ITreeEntry entry = (ITreeEntry) element;
return entry.getName();
}
这是JFace treeview组件渲染数据的一个方法。获取到一个节点对象,一定可以转换为节点接口类ITreeEntry ,这时候只是想设置节点名称,不需要知道是那一层节点,所以直接调用接口中的获取名称方法,就获取当前对象共有的获取名称方法。
分析代码2;
public class MyTableLableProvider implements ITableLabelProvider {
public String getColumnText(Object element, int columnIndex) {
ITreeEntry entry = (ITreeEntry) element;
switch (columnIndex) {
case 0:
return entry.getName();
case 1:
List list = entry.getChildren();
if (list == null)
return "";
return String.valueOf(list.size());
case 2:
if (entry instanceof PeopleEntity) {
boolean sex = ((PeopleEntity) entry).isSex();
return sex ? "男" : "女";
}
return "";
default:
return "";
}
}
这是JFace treeview组件渲染数据的另一种情况,因为这时候是table类型,结构稍微复杂点,核心是每个节点需要知道是那种类型,所以只需要判断一些节点独有属性,或者判断是那种类的实体类,或者通过判断当前列序号等已知数据,进行树渲染。
2014年11月28