需求:使用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. HDFS中Java的API使用测试

    import java.io.IOException; import java.util.Arrays; import java.util.Date; import java.util.Scanner ...

  2. Java中文档制作与继承

    1:如何制作帮助文档(了解) (1)写一个类 (2)加入文档注释 (3)通过javadoc工具生成即可 javadoc -d 目录 -author -version ArrayTool.java 2: ...

  3. iOS学习之GCD

    多线程编程 线程定义:一个CPU执行的CPU命令 列一条无分叉的路径就叫线程. 多线程:执行多个不同的CPU命令 有多条路径. 线程的使用:主线程(又叫作UI线程)主要任务是处理UI事件,显示和刷新U ...

  4. github使用心的

    Git是一个分布式的版本控制系统,最初由LinusTorvalds编写,用作Linux内核代码的管理.在推出后,Git在其它项目中也取得了很大成功,尤其是在Ruby社区中.包括Rubinius和Mer ...

  5. javaweb--上传文件使用灵活的自定义添加

    //upload2.jsp <%@ page language="java" import="java.util.*" pageEncoding=&quo ...

  6. 使用PHP处理文本小技巧

    PHP的Cli模式使用:http://www.php.net/manual/zh/features.commandline.php PHP命令行部分参数:-B     在处理 stdin 之前先执行 ...

  7. C#代码示例_调试

    调试信息 可使用如下两个命令输出调试信息: l Debug.WriteLine() l Trace.WriteLine() 这两个命令函数的用法几乎完全相同,但有一个重要区别.第一个命令仅在调试模式下 ...

  8. solr异常解决

    使用solr1.4跟solr3.1时,配置了个唯一id类型是sint 或者int,启动时在tomcat后台就会抛出这个异常: org.apache.solr.common.SolrException: ...

  9. 修改LR自带的示例程序端口号

    问题:LoadRunner的HP Web Tours 应用程序服务启动不了,提示1080端口被占用的问题 解决方法: 查看占用1080端口的进程 Cmd 窗口输入netstat –ano  找到占用该 ...

  10. android setVisibility失效不起作用的问题

    原因:不同的布局中有名字相同的控件,所以adapter中填充item的时候,由于控件名字相同没有正确识别你要显示的控件. 解决方法:给其中一个控件改一下名字就行了,超简单.