最近在项目中需要用到遍历某个目录下所有文件,并按照树形结构展示,同时还需要提供对树形菜单的选择展开等操作。在eclipse中提供了CheckboxTreeViewer组件来满足所需要的功能
下面是需要实现的功能:
1、使用TitleAreaDialog创建
TitleAreaDialog是Eclipse的Jface组件中的一个对话框,提供了显示的标题、提示信息和图标以及和内容区域,以及两个默认的按钮。我们在eclipse中常见的New Java Class Wizard就是一个典型的界面。
在自定义的界面中需要继承TitleAreaDialog
public class FrameworkFilterDialog extends TitleAreaDialog
绘制具体界面内容:实现createDialogArea
@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(0, 0, 658, 39);
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(0, 45, 658, 229);
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;
}
运行的效果如下:
2、这里对CheckboxTreeViewer的几个属性设置做进一步说明
checkboxTreeViewer.setContentProvider(new FrameworkConfigContentProvider());
checkboxTreeViewer.setLabelProvider(new FrameworkConfigLabelProvider());
根据方法名很容易知道,是对该树形结构提供数据和展现哪些数据。需要分别实现接口ITreeContentProvider:提供了获取下级元素和获取元素的方法。这里是一个简单的例子:
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 <= 0) {
return new Object[0];
}
return list;
}
return new Object[0];
}
@Override
public Object[] getElements(Object inputElement) {
if (inputElement instanceof File[]) {
File[] fileList = (File[]) inputElement;
if (fileList == null || fileList.length <= 0) {
return new Object[0];
}
return fileList;
}
return new Object[0];
}
@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 <= 0) {
return false;
}
return true;
}
return false;
}
}
同样对LabelProvider主要用于绘制菜单是显示的内容,如图标、标题等
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) > 0) {
return javaFile;
} else if (fileName.indexOf(XML_FILE) > 0) {
return xmlFile;
} else if (fileName.indexOf(PROP_FILE) > 0) {
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();
}
}
3、设置选中事件
包括两种:选中上级目录时子集目录全部选中、如果下级目录不是全部选中上级菜单也不能选中等
在CheckboxTreeViewer中提供了addCheckStateListener对选择事件的监听,这里需要实现上面说的功能:
checkboxTreeViewer.addCheckStateListener(new FrameworkCheckedListener(path.toOSString()));
FrameworkCheckedListener需要实现接口ICheckStateListener
@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());
}
}
}
4、菜单选中内容保存和初始化默认选中
对选择菜单的保存,采用这种方式提供了相应的事件监听okPressed:
/**
* 设置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)但是在实践中发现只会对一级菜单的项进行匹配选中,对二级或更多就无能为力了,不知道是我操作不正确还是怎么回事。
//set initialize checked: first level tree checked
if (!LogicUtil.isEmpty(checkedList)) {
File[] file = ProjectFileDirUtil.changePathToFiles(checkedList);
checkboxTreeViewer.setCheckedElements(file);
}
这里设置的对象需要和setInput中的数据类型保持一致。但是这里是会选中,也仅限于一级菜单。为了达到目的,这里对CheckboxTreeViewer中的Tree添加expand事件来实现
Tree tree = checkboxTreeViewer.getTree();
tree.setBounds(0, 45, 658, 229);
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接口,并根据特别的情况来设置相应的选中
@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);
}
}
}
分享到:
相关推荐
【描述】中的“直接导入就行,运行就行”意味着CheckboxTreeViewer的使用相对简单,只需将其导入到项目中,然后按照指定的方式配置和启动即可。"model中是文件的模型"这部分,指的是CheckboxTreeViewer的数据模型,...
为了在TreeViewer中添加复选框功能,我们需要使用CheckboxTreeViewer类,这是TreeViewer的一个扩展,专门为包含复选框的树节点而设计。 实现步骤如下: 1. **创建CheckboxTreeViewer实例**:首先,你需要在你的...
人才招聘网站 免费JAVA毕业设计 2024成品源码+论文+录屏+启动教程 启动教程:https://www.bilibili.com/video/BV1jKDjYrEz1 项目讲解视频:https://www.bilibili.com/video/BV1Tb421n72S 二次开发教程:https://www.bilibili.com/video/BV18i421i7Dx
EI复现:碳减排背景下综合能源服务商合作策略的纳什谈判理论与自适应交替方向乘子法求解,EI复现: 《考虑碳减排的综合能源服务商合作运行优化策略》 纯手工复现,主要通过纳什谈判理论进行博弈,并采用自适应交替方向乘子法进行分布式求解 ,核心关键词:EI复现; 碳减排; 综合能源服务商; 合作运行优化策略; 纳什谈判理论; 博弈; 自适应交替方向乘子法; 分布式求解,EI复现:纳什谈判理论下的碳减排能源服务商合作运行优化策略
一种高精度太阳能跟踪控制系统设计与实现.pdf
基于AHP-CRITIC组合变权与指标劣化度修正的赋权方法研究,38考虑劣化度APH-CRITIC组合变权 组合变权赋权方法,基于AHP和改进CRITIC计算主客观权重,引入指标劣化度构造变权函数对综合权重进行修正,还方法可以捕捉指标时序的劣化程度,实现数据的有效跟踪,评价更加合理。 可根据需求进行改进。 ,关键词:组合变权赋权方法;AHP;CRITIC;指标劣化度;变权函数;时序劣化程度;数据跟踪;评价合理。,基于AHP-CRITIC组合变权法:综合主客观权重与指标劣化度评价
"深入解析:车桥耦合程序,全注释代码与ANSYS及MATLAB联合应用,集车辆、桥梁模型与路面不平整度于一身的仿真系统",车桥耦合程序,每行代码都有注释 ansys 和matlab联合使用 车辆模型,桥梁模型和路面不平整度已写入程序 提供参考文章 桥梁模型可根据自己的模型修改。 ,车桥耦合程序;ANSYS;Matlab联合使用;车辆模型;桥梁模型;路面不平整度;模型修改,"ANSYS-Matlab车桥耦合程序,详解与优化"
基于MATLAB的SVM算法与颜色纹理分析的交通信号灯识别系统,MATLAB代码:SVM+颜色+纹理的交通信号灯识别。 ,SVM; 颜色识别; 纹理识别; 交通信号灯识别,MATLAB SVM算法:交通信号灯颜色与纹理识别
基于S7-200 PLC与组态王技术的切片机控制系统设计优化与实践应用,No.791 基于S7-200 PLC和组态王组态切片机控制系统设计 ,基于S7-200 PLC; 组态王组态; 切片机控制系统设计; 791号项目,基于PLC与组态王设计的切片机控制系统设计No.791
《pfc2D颗粒流软件及其在裂纹声发射监测中的应用研究》,pfc2D颗粒流软件,裂纹声发射监测 ,pfc2D; 颗粒流软件; 裂纹; 声发射监测; 监测技术,"PFC2D颗粒流软件在裂纹声发射监测中的应用"
"10kW双级式光伏并网逆变器Matlab仿真研究:前级Boost升压与后级DC-AC逆变控制策略的稳定性与波形分析",10kW双级式光伏并网逆变器matlab仿真 【1】前级boost升压+后级DC AC逆变; 【2】前级使用mppt最大功率追踪,输出最大功率电压; 【3】后级使用dq轴双闭环控制:外环直流电压环+内环电感电流环; 【4】10kHz开关频率,使用离散仿真,更模拟实际工况; 【5】在光伏波动的情况下依然可以稳定运行,具体波形如图所示。 【6】送一份5页的简单说明文档。 ,核心关键词: 1. 10kW双级式光伏并网逆变器 2. 前级boost升压+后级DC AC逆变 3. MPPT最大功率追踪 4. DQ轴双闭环控制 5. 10kHz开关频率 6. 离散仿真 7. 光伏波动 8. 稳定运行 9. 波形 10. 说明文档,Matlab仿真研究:10kW双级式光伏并网逆变器及其控制策略
基于西门子1200博图v15.1版本的单部四层自动化系统:全功能集成的真实运行仿真体验,单部四层,基于西门子1200博图v15.1版本 可直接仿真运行,视频就是真实运行画面,功能集全 ,核心关键词:单部四层; 西门子1200博图v15.1版本; 可仿真运行; 功能集全 分号分隔的结果为:单部四层; 西门子1200博图v15.1版本; 可直接仿真运行; 功能集全;,"西门子1200博图V15.1四层仿真系统,功能全面真实运行"
基于GPU的海战场环境研究.pdf
FPGA驱动双目视觉系统:立体匹配、视差图与深度图生成技术的研究与应用,FPGA双目视觉 立体视觉 视差图 深度图 双目立体匹配sgm sgbm tang 20k 高云fpga usb摄像头采集图像 ,FPGA双目视觉;立体视觉;视差图;深度图;双目立体匹配sgm;sgbm;高云FPGA;USB摄像头图像采集。,基于FPGA的双目视觉系统:立体匹配与深度图生成
MIM结构超表面全息技术:高效率、几何相位与FDTD仿真的综合案例研究,MIM结构 高效率超表面全息 几何相位 fdtd仿真 复现:2015年Nature nanotechnology : Metasurface holograms reaching 80% efficiency 介绍:MIM金Au-MgF2-金Au结构 纳米天线 激发磁偶极子模式,具有超高效率,纳米柱由几何相位设计,实现高效相位调制模式; 案例内容:主要包括金Au纳米天线单元结构仿真、几何相位计算,转效率计算,画图脚本,Gs算法设计全息相位,超表面全息仿真模型及脚本计算等 案例包括fdtd模型、fdtd设计脚本、GS算法的Matlab计算代码和结果,以及一份word教程,MIM结构仿真结果与文献完全一致,可以用于其他功能超表面的设计; ,MIM结构; 高效率超表面全息; 几何相位; fdtd仿真; metasurface holograms; 金Au纳米天线; 磁偶极子模式; 纳米柱; 超表面设计。,MIM结构超表面全息:高效率、几何相位与FDTD仿真案例研究
自习室座位预约系统 免费JAVA毕业设计 2024成品源码+论文+录屏+启动教程 启动教程:https://www.bilibili.com/video/BV1jKDjYrEz1 项目讲解视频:https://www.bilibili.com/video/BV1Tb421n72S 二次开发教程:https://www.bilibili.com/video/BV18i421i7Dx
基于太赫兹硅脊波导阵列的拓扑零模 式研究.pdf
Matlab在非线性微分方程数值模拟中的多维应用:涵盖平衡点曲线、势能曲线、相图与势阱图、时程曲线分析、庞加莱截面及分岔图与功率谱密度曲线的综合研究,Matlab求解非线性微分方程进行数值模拟,包括 1.平衡点曲线(可以三维图);2.势能曲线(可以三维图);3.相图和势阱图(三维);4.时程曲线分析;5.相图分析;6.庞加莱截面;7.分岔图;8.功率谱密度曲线等。 ,关键词:Matlab;非线性微分方程;数值模拟;平衡点曲线(三维图);势能曲线(三维图);相图和势阱图(三维);时程曲线分析;庞加莱截面;分岔图;功率谱密度曲线。,Matlab微分方程多维度模拟研究
基于Matlab GUI界面的动态手势识别系统:支持向量机SVM的机器学习应用与拓展,- 标题: 基于Matlab的动态手势识别 - 关键词:matlab GUI界面 动态手势识别 SVM 支持向量机 机器学习 手势数据集 - 步骤: - 动态检测:打开相机 载入数据库 获取当前帧 截取需要区域 识别手势 显示在GUI上 - 简述:支持检测图片,支持实时打开相机检测,机器学习算法识别率高,可识别1到10个手势,如需其他手势可自行训练拓展。 ,matlab GUI界面; 动态手势识别; SVM; 机器学习; 手势数据集; 动态检测; 实时相机检测; 识别率高,基于Matlab GUI的动态手势识别系统:SVM支持向量机算法高效识别
基于机器 学习的高层 建筑风荷载功率谱 预测算法研究.pdf