需求:使用FilteredTree实现一个下面这样的Dialog,要求Check框单选,即只能选择一个:当选择新的时候,旧的不选。说明:FilteredTree自带一个文本输入框。

1、自己的类继承org.eclipse.jface.dialogs.Dialog

2、在createDialogArea方法中实现自己的窗体:

 protected Control createDialogArea(Composite parent) {
Composite composite = new Composite(parent,SWT.NULL);
composite.getShell().setText("****选择"); composite.setLayout(new GridLayout(1,false));
GridData compositeGridData = new GridData(GridData.FILL_BOTH);
composite.setLayoutData(compositeGridData); Label title = new Label(composite,SWT.NONE);
title.setAlignment(SWT.LEFT);
title.setText("可选**信息");
title.setLayoutData(new GridData(SWT.LEFT,SWT.TOP,false,false,1,1)); ChooseProjectEntryFilteredTree filteredTree = new ChooseProjectEntryFilteredTree(
composite,
SWT.BORDER,
new ChooseProjectEntryPatternFilter(),
true);
this.treeViewer = filteredTree.getViewer();
//this.treeViewer.setUseHashlookup(true); this.tree = this.treeViewer.getTree();
this.tree.setToolTipText("请输入***的关键词"); this.checkboxTreeViewer = new CheckboxTreeViewer(this.tree); GridData gd = new GridData(SWT.FILL,SWT.FILL,true,false,1,1);
gd.heightHint = 250;
this.tree.setLayoutData(gd);
this.tree.setLinesVisible(true);
this.tree.setHeaderVisible(true); TreeColumn funcDecl = new TreeColumn(this.tree,SWT.CENTER);
funcDecl.setText("****");
funcDecl.setWidth(240);
funcDecl.addSelectionListener(new SelectionAdapter() {
boolean sortType = true; @Override
public void widgetSelected(SelectionEvent e) {
sortType = !sortType;
treeViewer.setSorter(sortType ? ChooseProjectEntrySorter.sorter
: ChooseProjectEntrySorter.reverseSorter);
} }); TreeColumn file = new TreeColumn(this.tree,SWT.CENTER);
file.setText("****");
file.setWidth(270); TreeColumn line = new TreeColumn(this.tree,SWT.CENTER);
line.setText("***");
line.setWidth(100); treeViewer.setContentProvider(new ChooseProjectEntryContentProvider());
treeViewer.setLabelProvider(new ChooseProjectEntryLabelProvider());
treeViewer.setSorter(ChooseProjectEntrySorter.sorter);
treeViewer.setInput(manager); this.selectedLabel = new Label(composite,SWT.NONE);
this.selectedLabel.setAlignment(SWT.LEFT);
GridData labelGd = new GridData(SWT.LEFT,SWT.TOP,true,false,1,1);
labelGd.widthHint = 380;
this.selectedLabel.setLayoutData(labelGd); this.checkboxTreeViewer.addCheckStateListener(checkStateListener); //this.treeViewer.addSelectionChangedListener(listener);
return null;
}

代码如下:

说明:

treeViewer.setContentProvider(new ChooseProjectEntryContentProvider());
treeViewer.setLabelProvider(new ChooseProjectEntryLabelProvider());
treeViewer.setSorter(ChooseProjectEntrySorter.sorter);
treeViewer.setInput(manager);

这里设置的是TreeViewer的content provider和label provider、sorter,所以并不能正常使用checkboxTreeViewer.setChecked()和setSubtreeChecked(),并不能像这个链接中那样设置指定行的checked状态为false,所以需要使用下面的方法:

1)、checkboxTreeViewer监听事件:

     /**
* 单选表格
*/
private ICheckStateListener checkStateListener = new ICheckStateListener(){
@Override
public void checkStateChanged(CheckStateChangedEvent event) {
if (event.getChecked()) {
setAllCheckedFalse();
//checkboxTreeViewer.setChecked(getTreeItem(event.getElement()), true);
checkFunc = (FuncItem)(event.getElement());
TreeItem item = getTreeItem(checkFunc);
if(item != null){
item.setChecked(true);
}
selectedLabel.setText("已选**:" + checkFunc.***);
}else{
checkFunc = null;
} treeViewer.refresh();
} };

代码如下:

2)、设置所有checked的行为unchecked状态:

 /**
* 设置所有被checked的选项unchecked
*/
private void setAllCheckedFalse(){
TreeItem[] items = this.tree.getItems(); if(items.length > 0){
for(int i = 0; i < items.length; i ++){
TreeItem item = items[i];
item.setChecked(false);
}
}
}

代码如下:

3)、getTreeItem函数:

 private TreeItem getTreeItem(FuncItem element){
TreeItem[] items = this.tree.getItems(); if(items.length > 0){
for(int i = 0; i < items.length; i ++){
TreeItem item = items[i];
if(element.equals((FuncItem)item.getData())){
return item;
}
}
} return null;
}

代码如下:

3、贴一下ChooseProjectEntryFilteredTree的代码

 /**
* 自行导入需要的包
*/
public class ChooseProjectEntryFilteredTree extends FilteredTree { public ChooseProjectEntryFilteredTree(Composite parent, int treeStyle,
PatternFilter filter, boolean useNewLook) {
super(parent, treeStyle, filter, useNewLook);
} @Override
protected TreeViewer doCreateTreeViewer(Composite parent, int style) {
return super.doCreateTreeViewer(parent, SWT.CHECK | SWT.SINGLE | SWT.BORDER
| SWT.V_SCROLL | SWT.H_SCROLL);
} }

代码如下:

4、贴一下ChooseProjectEntryPatternFilter的代码

 public class ChooseProjectEntryPatternFilter extends PatternFilter {

     @Override
protected boolean isLeafMatch(Viewer viewer, Object element) {
TreeViewer treeViewer = (TreeViewer) viewer; int numberOfColumns = treeViewer.getTree().getColumnCount(); ITableLabelProvider labelProvider = (ITableLabelProvider) treeViewer
.getLabelProvider(); boolean isMatch = false; for (int columnIndex = 0; columnIndex < numberOfColumns; columnIndex++) {
String labelText = labelProvider
.getColumnText(element, columnIndex);
isMatch |= wordMatches(labelText);
} return isMatch;
} }

代码如下:

ChooseProjectEntryContentProvider、ChooseProjectEntryLabelProvider、ChooseProjectEntrySorter跟一般的TreeViewer差不多,

这里再贴ChooseProjectEntryLabelProvider的部分代码:

 public class ChooseProjectEntryLabelProvider extends LabelProvider implements ITableLabelProvider{

     @Override
public Image getColumnImage(Object element, int columnIndex) {
return null;
} @Override
public String getColumnText(Object element, int columnIndex) { if(element instanceof FuncItem){
FuncItem func = (FuncItem)element;
switch(columnIndex){
case 0:
return func.***;
case 1:
return func.***;
case 2:
return String.valueOf(func.***);
default:
return "";
}
} return getText(element);
} }

代码如下

注意这里实现的是ITableLabelProvider接口。

我自己用checkboxTreeViewer.setChecked(element, state)无法设置event.getElement()【checkStateChanged方法中】元素的状态,

但是使用checkboxTreeViewer.setAllChecked(state)可以设置所有元素的状态为checked或者unchecked,

没办法,我又需要使用FilteredTree,又无法使用setChecked办法设置指定元素状态(我单步调试进入setChecked方法里面看了看,应该是event.getElement()元素的问题),只好想出上面的馊办法,希望对读者有用。

jface的CheckboxTreeViewer实现单选的更多相关文章

  1. 关于Eclipse导入maven项目报空指针异常

    今天新建了一个maven项目,因为是通过公司的工具新建的,代码拉下来就有src.pom.xml文件. 导入Eclipse却报空指针异常.具体如下: An error has occurred. See ...

  2. 关于JFace带复选框的树

    树的复选框用CheckboxTreeViewer实现.由于其子类ContainerCheckedTreeViewer在没有选择全部子节点时可以自动将父节点设置成灰选,所以实现树的复选框更多的是用Con ...

  3. 关于SWT常用组件(按钮,复选框,单选框(Button类))

    Button是SWT中最常用的组件.Button类的继承关系图: Button类的构造方法是newe Button(Composite parent,int style)它有两个参数: 第一个参数:是 ...

  4. swt,jface,rcp

    //swt-jface-rcp,基本结构:display类,shell类,组件:widget窗口控件,control控件,composites面板,button,label,text文本框,list列 ...

  5. (转)SWT的CheckBoxTreeViewer的相关用法

    最近在项目中需要用到遍历某个目录下所有文件,并按照树形结构展示,同时还需要提供对树形菜单的选择展开等操作.在eclipse中提供了CheckboxTreeViewer组件来满足所需要的功能 下面是需要 ...

  6. 简介SWT Jface

    可以使用标准窗口小部件工具箱(Standard Widget Toolkit,SWT)和 JFace 库来开发用于 Eclipse 环境的图形用户界面,而且还可以将它们用于开发单独的 GUI 本机应用 ...

  7. css3更改input单选和多选的样式

    在项目开发中我们经常会遇到需要更改input单选和多选样式的情况,今天就给大家介绍一种简单改变input单选和多选样式的办法. 在这之前先简单介绍一下:before伪类 :before 选择器向选定的 ...

  8. jquery对单选和下拉框的操作

    jquery 对表单的操作: 对单选框的操作: 一.对单选框的操作: 1.$('input

  9. dotNet平台模板列中的单选无效的解决方案

    最近在grid里添加一个单选列,最开始直接创建一个模板列,然后在模板列里放一个radiobutton.并指定其GroupName.这是radiabutton最常用的方法.但是在Grid里,这样却毫无效 ...

随机推荐

  1. 3、通过挂在系统光盘搭建本地yum仓库的方法

    1. mkdir xxx #新建文件夹 (新建一个挂载需要的文件夹) .配置本地yum源(挂载光盘) .进入 yum.repos.d .ls (查看当前文件夹全部的文件) 并 mv 修改   除Med ...

  2. Makefile 开发环境全能管家

    变量的应用: CC=gcc RM=rm EXE=main.exe OBJS=目标 伪目标的应用: .PHONY:clean 自动变量的应用: $@:表示一个规则的目标 $^:表示的是规则中的所有的先决 ...

  3. Linux 2>&1理解(转)

    2>&1使用一 相关知识1)默认地,标准的输入为键盘,但是也可以来自文件或管道(pipe |).2)默认地,标准的输出为终端(terminal),但是也可以重定向到文件,管道或后引号(b ...

  4. js常见函数汇总

    /**  * 隐藏元素  * @param {String} elem  */ function hide(elem){     var curDisplay = getStyle(elem, 'di ...

  5. Swiper说明&&API手册

    最近使用Swipe.js,发现中文的资料很少,试着翻译了一下.能力有限,翻译难免错漏,欢迎指出,多谢! 翻译自:http://www.idangero.us/sliders/swiper/api.ph ...

  6. Thrift 个人实战--RPC服务的发布订阅实现(基于Zookeeper服务)

    前言: Thrift作为Facebook开源的RPC框架, 通过IDL中间语言, 并借助代码生成引擎生成各种主流语言的rpc框架服务端/客户端代码. 不过Thrift的实现, 简单使用离实际生产环境还 ...

  7. LeetCode()Minimum Window Substring 超时,但觉得很清晰。

    我的超时思路,感觉自己上了一个新的台阶,虽然超时了,但起码是给出了一个方法. 遍历s 一遍即可,两个指针,当找到了一个合格的字串后,start 开始走,直到遇到s[start]在t中 如果不符合,en ...

  8. 使用Firefox user agent进行移动端网页测试

    Selenium 真是个强大的网页测试工具,设置Firefox user agent, 就可以轻松模拟手机端浏览器进行网页测试. Demo Code # -*- coding:utf8 -*- imp ...

  9. JavaScript tasks, microtasks, queues and schedules

    最近做的项目中,涉及到了JavaScript中Promise的用法,于是做了一点测试,发现没有想象中的那么简单,水很深,所以找来N先生(我的Mentor),想得到专业的指导.N先生也不尽知,但N先生查 ...

  10. 修改使用phpstorm创建的模板的默认注释