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里,这样却毫无效 ...
随机推荐
- springmvc学习第一天
一.helloworld的实现 1.加入jar包(加入无关的jar包可能会引起服务器的冲突) commons-logging-1.2.jarjstl.jarspring-aop-4.1.6.RELEA ...
- 【转】使用Sublime + PlantUML高效地画图
project: blog status: publish target: how-to-use-sublime-and-plant-uml-draw-diagram.md date: 2015-12 ...
- js 点击复制内容
<textarea id="pushUrlsTxt" rows="5" cols="55"></textarea> ...
- BZOJ 4326 树链剖分+二分+差分+记忆化
去年NOIP的时候我还不会树链剖分! 还是被UOJ 的数据卡了一组. 差分的思想还是很神啊! #include <iostream> #include <cstring> #i ...
- wndows程序设计之书籍知识与代码摘录-获取视屏显示器像素等参数GetsystemMetrics
以下的代码段用于获取视屏显示器的高度宽度,以像素为单位. int sxScreen, cyScreen; cxScreen = GetSystemMetrics (SM_CXSCREEN); cySc ...
- 从零开始学习Node.js例子六 EventEmitter发送和接收事件
pulser.js /* EventEmitter发送和接收事件 HTTPServer和HTTPClient类,它们都继承自EventEmitter EventEmitter被定义在Node的事件(e ...
- <转>两个蛋蛋的故事
来自为知笔记(Wiz)
- SQL 函数集锦
..STUFF()用另一子串替换字符串指定位置.长度的子串.STUFF (<character_expression1>, <start_ position>, <len ...
- samba 配置
sudo apt-get install samba sudo apt-get install kdenetwork-filesharing vi /etc/samba/smb.conf [Share ...
- Java-->服务器的响应(Servlet--doGet&doPost)
--> Servelet: 用于接收请求(客户端,浏览器),做出响应的,服务器端的,java类 --> ServletLogin -- Web项目服务器响应的Java实现 package ...