You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

SWT Tree组件:实现双击父节点不展开仅打开界面的需求

SWT Tree 实现双击父节点仅打开界面、点击箭头展开折叠的解决方案

嘿,刚好碰到过类似的需求,给你梳理下怎么搞定这个问题!核心就是要把双击节点文本点击箭头这两种操作的逻辑彻底分开,不能让默认行为搅在一起。

解决思路

SWT 的 Tree 默认会把双击父节点(不管点文本还是箭头)都触发展开/折叠,所以我们要做两件事:

  1. 拦截默认的展开/折叠事件,只允许点击箭头时执行展开/折叠;
  2. 单独处理双击节点的事件,只触发打开界面的逻辑。

具体代码实现

// 假设你的Tree实例是operationMenu
Tree operationMenu = new Tree(parent, SWT.BORDER);

// 第一步:拦截展开/折叠事件,只允许点击箭头时执行
operationMenu.addListener(SWT.Expand, event -> {
    // 判断展开事件的触发来源:SWT.DOUBLE是双击节点触发的,SWT.ARROW是点击箭头触发的
    if (event.detail == SWT.DOUBLE) {
        // 阻止双击触发的展开操作
        event.doit = false;
    }
});

operationMenu.addListener(SWT.Collapse, event -> {
    // 同样处理折叠事件
    if (event.detail == SWT.DOUBLE) {
        event.doit = false;
    }
});

// 第二步:处理双击事件,仅打开对应界面
operationMenu.addListener(SWT.MouseDoubleClick, event -> {
    TreeItem item = (TreeItem) event.item;
    // 判断是否是父节点(有子节点的就是父节点)
    if (item != null && item.getItems().length > 0) {
        // 这里写你打开界面的逻辑
        System.out.println("打开父节点对应的界面:" + item.getText());
        // 可以根据item的信息加载对应的界面组件
    }
});

代码解释

  • 拦截展开/折叠事件:通过SWT.ExpandSWT.Collapse监听器,检查事件的detail属性。当detailSWT.DOUBLE时,说明是双击节点触发的展开/折叠,我们设置event.doit = false来阻止这个默认行为;而点击箭头触发的事件detailSWT.ARROW,不会被拦截,正常执行展开/折叠。
  • 双击事件处理:在SWT.MouseDoubleClick监听器里,先获取双击的TreeItem,判断它是父节点(有子节点)后,执行打开界面的逻辑,完全不影响树形节点的状态。

这样设置后,双击父节点的文本区域只会打开界面,点箭头才会展开/折叠子节点,完美符合你的需求~

内容的提问来源于stack exchange,提问作者JimmyD

火山引擎 最新活动