jface的CheckboxTreeViewer实现单选
需求:使用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实现单选的更多相关文章
- 关于Eclipse导入maven项目报空指针异常
今天新建了一个maven项目,因为是通过公司的工具新建的,代码拉下来就有src.pom.xml文件. 导入Eclipse却报空指针异常.具体如下: An error has occurred. See ...
- 关于JFace带复选框的树
树的复选框用CheckboxTreeViewer实现.由于其子类ContainerCheckedTreeViewer在没有选择全部子节点时可以自动将父节点设置成灰选,所以实现树的复选框更多的是用Con ...
- 关于SWT常用组件(按钮,复选框,单选框(Button类))
Button是SWT中最常用的组件.Button类的继承关系图: Button类的构造方法是newe Button(Composite parent,int style)它有两个参数: 第一个参数:是 ...
- swt,jface,rcp
//swt-jface-rcp,基本结构:display类,shell类,组件:widget窗口控件,control控件,composites面板,button,label,text文本框,list列 ...
- (转)SWT的CheckBoxTreeViewer的相关用法
最近在项目中需要用到遍历某个目录下所有文件,并按照树形结构展示,同时还需要提供对树形菜单的选择展开等操作.在eclipse中提供了CheckboxTreeViewer组件来满足所需要的功能 下面是需要 ...
- 简介SWT Jface
可以使用标准窗口小部件工具箱(Standard Widget Toolkit,SWT)和 JFace 库来开发用于 Eclipse 环境的图形用户界面,而且还可以将它们用于开发单独的 GUI 本机应用 ...
- css3更改input单选和多选的样式
在项目开发中我们经常会遇到需要更改input单选和多选样式的情况,今天就给大家介绍一种简单改变input单选和多选样式的办法. 在这之前先简单介绍一下:before伪类 :before 选择器向选定的 ...
- jquery对单选和下拉框的操作
jquery 对表单的操作: 对单选框的操作: 一.对单选框的操作: 1.$('input
- dotNet平台模板列中的单选无效的解决方案
最近在grid里添加一个单选列,最开始直接创建一个模板列,然后在模板列里放一个radiobutton.并指定其GroupName.这是radiabutton最常用的方法.但是在Grid里,这样却毫无效 ...
随机推荐
- .NET/android/java/iOS AES通用加密解密
移动端越来越火了,我们在开发过程中,总会碰到要和移动端打交道的场景,比如.NET和android或者iOS的打交道.为了让数据交互更安全,我们需要对数据进行加密传输.今天研究了一下,把几种语言的加密都 ...
- iOS学习之内存管理
1.1 引用计数 Reference Count 1.2 自动引用计数,ARC(Automatic Reference Counting) 1引用计数 引用计数(Reference Count)是一个 ...
- Windows和Unix下的编码问题
今天测试shell脚本时,执行报错: ./report.sh: /tmp/tmp.E8ekx6r5Qq/report.sh: /bin/bash^M: bad interpreter: No such ...
- IOS网络开发(二)
1 局域网群聊软件 1.1 问题 UDP协议将独立的数据包从一台计算机传输到另外一台计算机,但是并不保证接受方能够接收到该数据包,也不保证接收方所接收到的数据和发送方所发送的数据在内容和顺序上是完全一 ...
- B - 搬寝室
Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Status Pract ...
- iOS开发中检测版本,有新版本则更新
iOS程序自动提示更新的实现方案大致分为两种: 第一种,自己服务器提供一个接口,告知相关app的当前版本,是否需要更新,以及更新的地址等信息 . 第二种,就是利用苹果的appstore 提供的相关ap ...
- 解决ListView和ScrollView同时使用时滑动的冲突问题
ScrollView外面包裹了一个ListView,解决其滑动冲突问题: 只需自定义ListView,命名MyListView: public class MyListView extends Lis ...
- Server ran out of threads to serve requests. Consider raising the ThreadsPerChild setting
最近每天半夜,服务器都会出现崩掉的现象,pc app 都不能正常使用 查看错误日志发现问题所在: [Wed Nov 09 08:07:28.651642 2016] [mpm_winnt:error ...
- Sprint第二个冲刺(第九天)
一.Sprint 计划会议: 现在简单说一下Sprint2的进展情况:大部分功能已经完成或者正在做,此次Sprint2中最难的设计商家的数据库表格已经完成了,剩下的其他功能都是比较耗时的,现在也在抓紧 ...
- C/C++的四大内存分区 分类: C/C++ 2015-05-09 01:36 163人阅读 评论(0) 收藏
导读 正确的理解C/C++程序的内存分区,是合格程序猿的基本要求. 网络上流形两大版本内存分区,分别为: 1. 五大内存分区:堆.栈.全局/静态存储区.自由存储区和常量存储区. 2. 五大内存分区:堆 ...