基本实现
参考博客:https://blog.youkuaiyun.com/xqingab/article/details/55096482
需要实现:
视图查看器:TreeViewer,内容提供器:ContentProvider ,标签提供器:LabelProvider; 建立树的模型:包括树的父节点,树的子节点。
树形图
1.带复选框的树形实现https://www.cnblogs.com/panmingzhi815/p/3827161.html
2. https://bbs.youkuaiyun.com/topics/350003096
3.树的子节点的隐藏和显示
treeViewer.expandAll();
treeViewer.collapseAll();
4.树形表格的创建:TreeColumn类+更改TreeLabelProvider(implement ITableLabelProvider)
参考博客:https://lengbingteng-163-com.iteye.com/blog/1459152
5.实现双击节点事件:
tree = treeViewer.getTree();
tree.addListener(SWT.MouseDoubleClick, new Listener() {
@Override
public void handleEvent(Event arg0) {
// TODO Auto-generated method stub
MessageDialog.openInformation(null, "", "hello");
}
});
6.实现树节点选中事件:
treeViewer.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
if (event.getSelection().isEmpty()) {
return;
}
if (event.getSelection() instanceof IStructuredSelection) {
IStructuredSelection selection = (IStructuredSelection) event.getSelection();
String nameToShow = new String();
Itree domain = (Itree) selection.getFirstElement();
String value = domain.getName();
nameToShow = value;
// if(toShow.length() > 0) {
// toShow.setLength(toShow.length() - 2);
// }
if (nameToShow != null)
preNameShow.setText(nameToShow);
else
preNameShow.setText("null");
}
}
});
待解决问题:
1.问题在于如何使树默认全部选中?(已解决)
https://bbs.youkuaiyun.com/topics/350003096给了我灵感。
代码如下(遍历了整个树):
注意在调用下列代码时,要先treeViewer.expandAll();将整棵树展开,否则不能更新到所有节点。
private void treeSet(Itree item) {
//System.out.println(item.getName());
List<Itree> childs = item.getChildren();
if(childs !=null) {
for(Itree child : childs) {
treeViewer.setChecked(child, true);
child.setChecked(true);
treeSet(child);
}
}
}
private void setAllTreeChecked() {
TreeItem[] items = this.tree.getItems();
if(items.length > 0){
for(int i = 0; i < items.length; i ++){
TreeItem item = items[i];
item.setChecked(true);
Itree node = (Itree)item.getData();
node.setChecked(true);
treeSet(node);
}
}
}
其实有个函数:checkboxTreeViewer.setSubtreeChecked(arg0.getElement(), checked);,但是我没有找到如何设置第一个参数,所以只能采用了上面的笨办法。
2.如何双击改变节点信息?(已解决)
3.如何将复选框状态传给数据来源,进行数据修改?(已解决)
2.3其实是一种问题,我测试了一下,发展jface中的treeView自动实现树与原数据的更新,当你更新树结点信息的时候,自动更新原数据信息。
TreeItem ti = (TreeItem) checkboxTreeViewer.testFindItem(arg0.getElement());
ti.setChecked(checked);
Itree cnt = (Itree) ti.getData();
cnt.setChecked(checked);
其实只要找到 Itree,更改其值,就会自动更改链接数据,
IStructuredSelection selection = (IStructuredSelection) treeViewer.getSelection();
Itree domain = (Itree) selection.getFirstElement();
if (setNewName.getText() != null && domain != null)
domain.setRename(setNewName.getText());
通过调用发现后台数据是被更改了,但是新的问题出现了。
4. 如何更新树节点显示信息?
将数据更改后,但是treeViewer显示的内容却没有改变,ps,treeViewer.reflesh() 已经失败