Eclipse插件开发,树形图

本文介绍了在Eclipse插件开发中如何实现带复选框的树形图,包括树的子节点隐藏显示、树形表格创建、双击和选中事件的处理。通过参考相关博客,解决了树默认全选、双击修改节点信息以及复选框状态同步数据等问题,但目前遇到更新树节点显示信息的挑战。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基本实现

参考博客: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() 已经失败

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值