最近在项目中需要用到遍历某个目录下所有文件,并按照树形结构展示,同时还需要提供对树形菜单的选择展开等操作。在eclipse中提供了CheckboxTreeViewer组件来满足所需要的功能 下面是需要实现的功能: 按照树形菜单列出指定目录下文件列表 对菜单操作的相应处理,如选中父级菜单子集选中等 选中的菜单内容保存,并再次打开中默认选中 1、使用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(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的几个属性设置做进一步说明 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 <= 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主要用于绘制菜单是显示的内容,如图标、标题等 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) > 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对选择事件的监听,这里需要实现上面说的功能: 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()); } } } 4、菜单选中内容保存和初始化默认选中 对选择菜单的保存,采用这种方式提供了相应的事件监听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(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接口,并根据特别的情况来设置相应的选中 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); } } }
相关推荐
【描述】中的“直接导入就行,运行就行”意味着CheckboxTreeViewer的使用相对简单,只需将其导入到项目中,然后按照指定的方式配置和启动即可。"model中是文件的模型"这部分,指的是CheckboxTreeViewer的数据模型,...
为了在TreeViewer中添加复选框功能,我们需要使用CheckboxTreeViewer类,这是TreeViewer的一个扩展,专门为包含复选框的树节点而设计。 实现步骤如下: 1. **创建CheckboxTreeViewer实例**:首先,你需要在你的...
白色简洁风格的学术交流会议源码下载.zip
内容概要:本文提出了利用交变电流场测量(ACFM)技术对水下结构中的缺陷进行可视化和智能识别的方法。通过对缺陷引起畸变磁场的分析,开发了梯度成像算法作为图像预处理方法,突显了缺陷的视觉形态。实验验证了梯度成像算法的有效性,并利用卷积神经网络(CNN)深度学习算法识别预处理后的灰度图样本。实验结果显示,电流扰动理论澄清了特征信号与缺陷形态之间的关系,单裂纹、不规则裂纹和腐蚀等缺陷可以被智能识别和准确评估。 适合人群:从事水下结构检测的研究人员和技术人员,以及对非破坏性检测技术感兴趣的工程领域人士。 使用场景及目标:① 海洋钻井平台、管道、海底油气处理设施等水下结构的缺陷检测;② 利用交变电流场测量技术和图像处理技术提高缺陷识别的准确性和智能化程度。 其他说明:本文不仅提出了交变电流场测量技术的新方法,还通过实验证明了这些方法的有效性,为实际应用提供了技术支持。
Neck Deep - In Bloom [mqms2].mgg2.flac
基于ESO的永磁同步电机无感FOC 1.采用线性扩张状态观测器(LESO)估计电机反电势,利用锁相环从反电势中提取位置和转速信息,从而实现无位置传感器控制; 2.提供算法对应的参考文献和仿真模型。 购买赠送PMSM控制相关电子资料。 仿真模型纯手工搭建,不是从网络上复制得到。 仿真模型仅供学习参考。内容来源于网络分享,如有侵权请联系我删除。另外如果没有积分的同学需要下载,请私信我。
三相逆变 单相 三相逆变器 SPWM ---stm32主控(输入、输出具体可根据需要设定),本逆变器可以二次开发。 本内容只包括 逆变程序,实现变频(0~100Hz)、变压调节,均有外接按键控制(使用C语言实现)。
NSConditionException如何解决.md
白色简洁风格的房产交易中心企业网站源码下载.zip
水果分拣机15可编辑全套技术资料100%好用.zip
内容概要:本文为《1+X移动互联网应用开发初级》课程的期中考试试卷解析。解析涵盖了Java开发入门基础知识,主要包括Android中SQLite数据库操作、ContentProvider使用、BroadcastReceiver、Intent传递数据、Activity生命周期、Service生命周期管理、文件操作模式、通知管理、JSON和XML解析、权限管理等内容。通过对各个题目的解析,帮助学生更好地理解和掌握移动互联网应用开发的基础知识和技术。 适合人群:正在学习《1+X移动互联网应用开发初级》课程的学生,尤其是网络21班的学生。 使用场景及目标:①帮助学生理解和掌握Android开发的基础知识点;②提高学生的实际操作能力,尤其是在期中考试后的查漏补缺。 阅读建议:建议学生在阅读解析时,结合教材和实践操作,加深对各知识点的理解。同时,可以通过模拟题进行练习,巩固学习成果。
自动送料切割机sw可编辑全套技术资料100%好用.zip
ClosedChannelException(解决方案).md
长焊缝打磨机step全套技术资料100%好用.zip
从给定的文件信息来看,核心知识点聚焦于内部审计业务的实施,特别是内部审计师如何遵循规范、标准和最佳实践来进行审计工作。以下是对关键知识点的深入解析: ### 内部审计业务实施的关键要素 #### 理解内部审计业务全过程 内部审计业务覆盖了从计划、实施、报告到后续跟踪的全过程,要求内部审计师具备全面的专业技能和严谨的工作态度。这一过程旨在确保组织的风险管理、控制和治理机制的有效性。 #### 核心业务类型 内部审计主要包括确认和咨询两大业务类型。确认服务侧重于评估组织的控制和风险管理程序,而咨询服务则更注重提供改进和优化现有流程的建议。 ### 实施内部审计的依据与标准 #### IIA职业实务框架 - **标准与道德规范**:包括内部审计实务标准和职业道德规范,前者指导内部审计活动的执行,后者强调审计师的公正、客观、保密和胜任能力。 - **实务公告**:提供非强制性的指导,涉及内部审计的特定操作流程和程序。 - **发展与实务帮助**:涵盖各种专业资源,如研究资料、书籍和培训课程,为审计人员提供深入的学习和支持。 #### 法律、法规和其他标准 除了IIA框架外,内部审计还应考虑适用
IncompatibleClassChangeError(解决方案).md
html渲染器,粘贴html代码到这个渲染器即可渲染出对应的效果
白色简洁风格的时尚宝马老爷车企业网站模板下载.zip
白色宽屏风格的贸易商务企业网站模板.zip
白色宽屏风格的旅游路线推荐整站网站源码下载.zip