最近在项目中需要用到遍历某个目录下所有文件,并按照树形结构展示,同时还需要提供对树形菜单的选择展开等操作。在eclipse中提供了CheckboxTreeViewer组件来满足所需要的功能
下面是需要实现的功能:
按照树形菜单列出指定目录下文件列表
对菜单操作的相应处理,如选中父级菜单子集选中等
选中的菜单内容保存,并再次打开中默认选中 、使用TitleAreaDialog创建
TitleAreaDialog是Eclipse的Jface组件中的一个对话框,提供了显示的标题、提示信息和图标以及和内容区域,以及两个默认的按钮。我们在eclipse中常见的New Java Class Wizard就是一个典型的界面。
在自定义的界面中需要继承TitleAreaDialog
Java代码
public class FrameworkFilterDialog extends TitleAreaDialog
绘制具体界面内容:实现createDialogArea
Java代码
@Override
protected Control createDialogArea(Composite parent) {
Composite area = (Composite) super.createDialogArea(parent);
Composite container = new Composite(area, SWT.NONE);
container.setLayoutData(new GridData(GridData.FILL_BOTH));
//设置消息标题、消息信息
setTitle("Configuration ...........");
setMessage("配置该工程下的文件.........."); //主体内容部分,这里做一些必要描述
Label lblNewLabel = new Label(container, SWT.NONE);
lblNewLabel.setBounds(, , , );
lblNewLabel.setText("工程名: " + project.getName() + "\n请选择需要的文件........................."); IPath path = project.getRawLocation(); //这里绑定CheckboxTreeViewer 的相关属性和事件监听
CheckboxTreeViewer checkboxTreeViewer = new CheckboxTreeViewer(container, SWT.BORDER);
checkboxTreeViewer.setContentProvider(new FrameworkConfigContentProvider());
checkboxTreeViewer.setLabelProvider(new FrameworkConfigLabelProvider());
checkboxTreeViewer.addCheckStateListener(new FrameworkCheckedListener(path.toOSString()));
checkboxTreeViewer.setInput(ProjectFileDirUtil.listProjectFileDirec(path.toString())); Tree tree = checkboxTreeViewer.getTree();
tree.setBounds(, , , );
List<String> checkedList = FrameFilterManager.getManager().getFrameworkFilterFiles(project.getName()); //bind tree expand event: initialize tree checked
tree.addListener(SWT.Expand, new FrameworkExpandListener(checkedList)); //set initialize checked: first level tree checked
if (!LogicUtil.isEmpty(checkedList)) {
File[] file = ProjectFileDirUtil.changePathToFiles(checkedList);
checkboxTreeViewer.setCheckedElements(file);
} return area;
}
运行的效果如下:
、这里对CheckboxTreeViewer的几个属性设置做进一步说明
Java代码
checkboxTreeViewer.setContentProvider(new FrameworkConfigContentProvider());
checkboxTreeViewer.setLabelProvider(new FrameworkConfigLabelProvider());
根据方法名很容易知道,是对该树形结构提供数据和展现哪些数据。需要分别实现接口ITreeContentProvider:提供了获取下级元素和获取元素的方法。这里是一个简单的例子:
Java代码
public class FrameworkConfigContentProvider implements ITreeContentProvider { @Override
public void dispose() { } @Override
public void inputChanged(Viewer arg0, Object arg1, Object arg2) { } @Override
public Object[] getChildren(Object parentElement) {
if (parentElement instanceof File) {
File file = (File) parentElement;
File[] list = file.listFiles(new ProjectDirFileFilter());
if (list == null || list.length <= ) {
return new Object[];
}
return list;
}
return new Object[];
} @Override
public Object[] getElements(Object inputElement) {
if (inputElement instanceof File[]) {
File[] fileList = (File[]) inputElement;
if (fileList == null || fileList.length <= ) {
return new Object[];
}
return fileList;
}
return new Object[];
} @Override
public Object getParent(Object arg0) {
return null;
} @Override
public boolean hasChildren(Object inputElement) {
if (inputElement instanceof File) {
File file = (File) inputElement;
File[] list = file.listFiles(new ProjectDirFileFilter());
if (list == null || list.length <= ) {
return false;
}
return true;
}
return false;
}
} 同样对LabelProvider主要用于绘制菜单是显示的内容,如图标、标题等
Java代码
public class FrameworkConfigLabelProvider extends LabelProvider { private static final String PACKAGE = "src";
private static final String JAVA_FILE = ".java";
private static final String XML_FILE = ".xml";
private static final String PROP_FILE = ".properties"; private Image javaFile = new Image(Display.getCurrent(), getClass().getResourceAsStream(
CommonConstants.ICON_JAVA_OBJ)); private Image file = new Image(Display.getCurrent(), getClass().getResourceAsStream(
CommonConstants.ICON_FILE_OBJ)); private Image xmlFile = new Image(Display.getCurrent(), getClass().getResourceAsStream(
CommonConstants.ICON_XML_OBJ)); private Image folderFile = new Image(Display.getCurrent(), getClass().getResourceAsStream(
CommonConstants.ICON_FILEFOLDER_OBJ)); private Image packageFolderFile = new Image(Display.getCurrent(), getClass().getResourceAsStream(
CommonConstants.ICON_PACKAGE_FOLDER)); private Image propFile = new Image(Display.getCurrent(), getClass().getResourceAsStream(
CommonConstants.ICON_PROP_OBJ)); @Override
public Image getImage(Object element) { if (element instanceof File) {
File file = (File) element;
String fileName = file.getName();
//source folder
if (fileName.equals(PACKAGE)) {
return packageFolderFile;
}
//folder
if (file.isDirectory()) {
return folderFile;
}
//judge by suffix
if (fileName.indexOf(JAVA_FILE) > ) {
return javaFile;
} else if (fileName.indexOf(XML_FILE) > ) {
return xmlFile;
} else if (fileName.indexOf(PROP_FILE) > ) {
return propFile;
}
}
return file;
} @Override
public String getText(Object element) {
File file = (File) element;
return file.getName();
} @Override
public void dispose() {
javaFile.dispose();
packageFolderFile.dispose();
folderFile.dispose();
xmlFile.dispose();
propFile.dispose();
file.dispose();
super.dispose();
} } 、设置选中事件
包括两种:选中上级目录时子集目录全部选中、如果下级目录不是全部选中上级菜单也不能选中等
在CheckboxTreeViewer中提供了addCheckStateListener对选择事件的监听,这里需要实现上面说的功能:
Java代码
checkboxTreeViewer.addCheckStateListener(new FrameworkCheckedListener(path.toOSString()));
FrameworkCheckedListener需要实现接口ICheckStateListener
Java代码
@Override
public void checkStateChanged(CheckStateChangedEvent event) {
if (event.getChecked()) {
CheckboxTreeViewer viewer = (CheckboxTreeViewer) event.getSource();
//选中:设置下级菜单选中
viewer.setSubtreeChecked(event.getElement(), true);
//选中:如果是子集菜单,且同级菜单全是选中的时候设置parent选中
//同样如果此时parent所在的同级菜单全选中做相应的迭代处理
//TODO:获取所有选中的项,比较绝对路径 } else {
CheckboxTreeViewer viewer = (CheckboxTreeViewer) event.getSource();
//不选中:下级目录菜单全不选中
File file = (File) event.getElement();
viewer.setSubtreeChecked(file, false);
//不选中:如果父级菜单是选中不能设置为选中
File parent = file.getParentFile();
//这里需要注意如果是顶级菜单不再迭代设置,否则将会空指针
if (parent.exists() && !parent.getAbsolutePath().equals(projectRoot)) {
setParentUnchecked(viewer, file.getParentFile());
}
} } 、菜单选中内容保存和初始化默认选中
对选择菜单的保存,采用这种方式提供了相应的事件监听okPressed:
Java代码
/**
* 设置OK点击事件后相应处理
*/
@Override
protected void okPressed() {
Object[] dirFiles = checkboxTreeViewer.getCheckedElements();
List<String> dataList = new ArrayList<String>();
for (Object obj : dirFiles) {
if (obj instanceof File) {
File file = (File) obj;
dataList.add(file.getAbsolutePath());
}
}
//将选中的结果保存
FrameFilterManager.getManager().saveFrameworkFilterFiles(project.getName(), dataList);
super.okPressed();
}
对初始化选中是让人很纠结的一件事,在CheckboxTreeViewer中提供了setCheckedElements(Objects[ ] args)但是在实践中发现只会对一级菜单的项进行匹配选中,对二级或更多就无能为力了,不知道是我操作不正确还是怎么回事。
Java代码
//set initialize checked: first level tree checked
if (!LogicUtil.isEmpty(checkedList)) {
File[] file = ProjectFileDirUtil.changePathToFiles(checkedList);
checkboxTreeViewer.setCheckedElements(file);
}
这里设置的对象需要和setInput中的数据类型保持一致。但是这里是会选中,也仅限于一级菜单。为了达到目的,这里对CheckboxTreeViewer中的Tree添加expand事件来实现
Java代码
Tree tree = checkboxTreeViewer.getTree();
tree.setBounds(, , , );
List<String> checkedList = FrameFilterManager.getManager().getFrameworkFilterFiles(project.getName()); //bind tree expand event: initialize tree checked
tree.addListener(SWT.Expand, new FrameworkExpandListener(checkedList));
这里FrameworkExpandListener需要实现SWT中的Listener接口,并根据特别的情况来设置相应的选中
Java代码
@Override
public void handleEvent(Event event) { if (LogicUtil.isEmpty(checkedList)) {
checkedList = new ArrayList<String>();
} //当前点击item
TreeItem item = (TreeItem) event.item;
TreeItem[] items = item.getItems(); for (TreeItem treeItem : items) {
File file = (File) treeItem.getData();
if (checkedList.contains(file.getAbsolutePath())) {
treeItem.setChecked(true);
}
}
}

(转)SWT的CheckBoxTreeViewer的相关用法的更多相关文章

  1. slf4j log4j logback关系详解和相关用法

    slf4j log4j logback关系详解和相关用法 写java也有一段时间了,一直都有用slf4j log4j输出日志的习惯.但是始终都是抱着"拿来主义"的态度,复制粘贴下配 ...

  2. $.ajax等相关用法

    下面是jquery一些方法的相关用法: $.ajax: $.ajax({ type: "GET", url: "url", data: {username:$( ...

  3. oradmin相关用法

    [转]oradmin相关用法 创建例程: -NEW -SID sid | -SRVC 服务 [-INTPWD 口令] [-MAXUSERS 数量] [-STARTMODE a|m] [-PFILE 文 ...

  4. #ifdef预编译相关用法

    #ifdef预编译相关用法主要有:(1)#ifdef XXX executing the corresponding xxx code #endif(2)#ifdef XXX executing th ...

  5. Java中Date各种相关用法

    Java中Date各种相关用法(一) 1.计算某一月份的最大天数 Java代码 Calendar time=Calendar.getInstance(); time.clear(); time.set ...

  6. Js相关用法个人总结

    Js相关用法个人总结  js中将数组元素添加到对象中var obj = {}; var pushArr = [11,22,33,44,55,66]; for(var i=0;i<pushArr. ...

  7. Css相关用法个人总结

    Css相关用法个人总结

  8. 关于Unity中的刚体和碰撞器的相关用法(二)

    在关于Unity中的刚体和碰撞器的相关用法(一)的基础上 有一个plane平面,一个ball球体,都挂了碰撞器,ball挂了刚体Rigidbody,写了一个脚本ball挂载在球体上,球体从空中落下装机 ...

  9. STL中的Vector相关用法

    STL中的Vector相关用法 标准库vector类型使用需要的头文件:#include <vector>. vector 是一个类模板,不是一种数据类型,vector<int> ...

随机推荐

  1. 奇葩的UI引用LayoutInflater.from问题

    今收到BUG一枚,一个页面的EditText的风格变为了系统默认(系统经过定制,风格和普通的不同) 经检查xml无任何不妥,最终问题出在LayoutInflater.from上. 如果LayoutIn ...

  2. C++学习之路—多态性与虚函数(二)纯虚函数与抽象类

    (根据<C++程序设计>(谭浩强)整理,整理者:华科小涛,@http://www.cnblogs.com/hust-ghtao转载请注明) 1    纯虚函数 在前面的博客中已经提到:有时 ...

  3. viewDidLoad、viewDidUnload、viewWillAppear、viewDidAppear、viewWillDisappear 和 -viewDidDisappear的区别和使用

    首先看一下官方解释: - (void)loadView; // This is where subclasses should create their custom view hierarchy i ...

  4. MongoDB学习笔记(六) MongoDB索引用法和效率分析

    MongoDB中的索引其实类似于关系型数据库,都是为了提高查询和排序的效率的,并且实现原理也基本一致.由于集合中的键(字段)可以是普通数据类型,也可以是子文档.MongoDB可以在各种类型的键上创建索 ...

  5. ZeroMQ:云计算时代最好的通讯库

    还在学socket编程吗?还在研究为什么epoll比select更好吗? 噢,不必了! 在复杂的云计算环境中,我们面临的难题远比这个复杂得多. 庞大的服务器集群作为计算云,对来来看或许只是一个简单的搜 ...

  6. Delphi 获取网站验证码的图片

    uses ActiveX,ComObj; procedure TfrmMain.FormCreate(Sender: TObject); begin OleInitialize(nil); end; ...

  7. Git 图解剖析(转)

    git中文件内容并没有真正存储在索引(.git/index)或者提交对象中,而是以blob的形式分别存储在数据库中(.git/objects),并用SHA-1值来校验. 索引文件用识别码列出相关的bl ...

  8. 设计模式 - 装饰者模式(Decorator Pattern) Java的IO类 用法

    装饰者模式(Decorator Pattern) Java的IO类 用法 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26716 ...

  9. 深入理解 JBoss 7/WildFly Standalone 模式启动过程

    概述 JBoss 7/WildFly Standalone 模式启动过程大致例如以下: 启动脚本 standalone.sh 启动 JBoss Modules,JBoss Modules 启动 JBo ...

  10. Swift - 多行文本输入框(UITextView)的用法

    1,多行文本控件的创建 1 2 3 4 var textview=UITextView(frame:CGRectMake(10,100,200,100)) textview.layer.borderW ...