SWT TreeViewer在设置SWT.FULL_SELECTION时同时展开和折叠
问题描述:
我已经实现了TreeViewer,并在其中添加了双击侦听器。这个双击监听器应该展开/折叠节点。SWT TreeViewer在设置SWT.FULL_SELECTION时同时展开和折叠
treeViewer = new TreeViewer(component, SWT.BORDER | SWT.MULTI);
treeViewer.addDoubleClickListener(new IDoubleClickListener() {
public void doubleClick(DoubleClickEvent e) {
final IStructuredSelection selection = (IStructuredSelection) e
.getSelection();
if (selection == null || selection.isEmpty())
return;
final Object sel = selection.getFirstElement();
TreeNode selNode = (TreeNode) sel;
if (treeViewer.getExpandedState(sel)) {
treeViewer.collapseToLevel(sel, 1);
} else {
treeViewer.expandToLevel(sel, 1);
}
}
});
现在,如果我改变的TreeViewer是FULL_SELECTION像...
treeViewer = new TreeViewer(component, SWT.BORDER | SWT.MULTI | SWT.FULL_SELECTION);
这behavoiur更改很奇怪。
当双击显示标签的节点时,一切都如前所述。但是当点击该行时,离标签稍远一点,节点同时展开/折叠,完全没有改变。
调试它我发现,在我收到双击事件之前,还有另一个事件被触发(或者是在我处理它之前正在侦听它),扩展/折叠特定节点。禁用监听器,我能够摆脱这种行为。但是当双击标签时,这又禁用了节点的扩展。
我在调试eclipse时看到过类似的行为,并想知道这是一个知道的bug还是更坏的预期行为?
任何建议表示感谢,并提前谢谢!
答
我可以观察到你在Windows 7上描述的问题。这个东西展开/折叠项目很可能是本机代码。
虽然我认为这是SWT或Win32树形控件中的一个bug,并且在SWT中修复或解决了这个问题,但我发现了一种可以一见成效的解决方法。如果在Tree
小部件上使用SWT侦听器而不是IDoubleClikListener
,则可以确定标签本身是否已单击,或者仅确定行并自行展开/折叠该项目,或者将其保留为。
treeViewer.getTree().addListener(SWT.DefaultSelection, new Listener() {
@Override
public void handleEvent(Event event) {
TreeItem treeItem = (TreeItem)event.item;
Point cursorLocation = event.display.getCursorLocation();
Point localCursorLocation = treeItem.getParent().toControl(cursorLocation);
if(treeItem.getBounds().contains(localCursorLocation)) {
// put your JFace expand/collapse code here
}
}
});
由于此问题可能取决于平台,因此您应该在所有目标平台上进行测试。
谢谢你的回答。 我自己正在搞这个想法,但无法弄清楚如何让我的手在标签或行被点击。 +1。 我会在接下来的日子里进一步检查,但现在我会将其标记为正确的答案。 – Dalewn 2015-03-14 18:09:22
我测试了你的代码,它适用于我。我只需要将'treeItem.getBounds(int Index)'修改为'treeItem.getBounds()',以便使它适用于多列树。 – Dalewn 2015-03-16 08:57:01
感谢您的反馈,我已经更新了相应的答案。 – 2015-03-16 09:16:06