我已经实现了一个TreeViewer,并添加了一个双击监听器。这个双击监听器应该扩展/折叠一个节点。
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);
这种行为改变了一些奇怪的东西。
当双击显示标签的节点时,一切都像以前一样工作。但是当点击该行时,距离标签稍远一点,节点会同时展开/折叠,完全没有变化。
调试它我发现,在我收到的双击事件之前,还有另一个事件被触发(或者在我处理它之前正在听它),扩展/折叠特定节点。禁用侦听器我能够摆脱这种行为。但是当双击标签时,这再次禁用了节点的扩展。
我在调试时看到了eclipse中的类似行为,并想知道这是一个知道错误还是更糟糕的预期行为?
任何建议都表示赞赏,并提前致谢!
答案 0 :(得分:1)
我可以观察到您在Windows 7上描述的问题。扩展/折叠项目的某些内容很可能是本机代码。
虽然我认为这是SWT或Win32树控件中should be reported并在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
}
}
} );
由于此问题可能取决于平台,因此您应该在所有目标平台上进行测试。