SWT TreeViewer 在设置 SWT.FULL_SELECTION 时同时展开和折叠
SWT TreeViewer expand and collaps at the same time when SWT.FULL_SELECTION is set
我已经实现了一个 TreeViewer,并添加了一个双击监听器。这个双击侦听器应该 expand/collapse 一个节点。
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);
此行为变得有些奇怪。
当双击显示标签的节点时,一切正常。但是,当单击该行时,距离标签稍远一点,节点同时获得 expanded/collapsed,完全没有变化。
调试它我发现,在我收到的双击事件之前有另一个事件被触发(或者在我处理它之前某事正在监听它),expanding/collapsing 特定节点。禁用监听器我能够摆脱这种行为。但是当双击标签时,这再次禁用了节点的扩展。
我在调试时在 eclipse 中看到了类似的行为,想知道这是已知错误还是更糟糕的预期行为?
如有任何建议,我们将不胜感激,并在此先致谢!
我可以观察到您在 Windows 7 上描述的问题。某事 expands/collapses 一个项目很可能是本机代码。
虽然我认为这是 SWT 或 Win32 树控件中的一个错误 should be reported 并在 SWT 中修复或解决,但我发现了一个乍一看可行的解决方法。如果您在 Tree
小部件而不是 IDoubleClikListener
小部件上使用 SWT 侦听器,您可以确定是否单击了标签本身或仅单击了 行 和 expand/collapse 项目自己或留给那个 something.
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
}
}
} );
由于此问题可能与平台有关,您应该在所有目标平台上进行测试。
我已经实现了一个 TreeViewer,并添加了一个双击监听器。这个双击侦听器应该 expand/collapse 一个节点。
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);
此行为变得有些奇怪。
当双击显示标签的节点时,一切正常。但是,当单击该行时,距离标签稍远一点,节点同时获得 expanded/collapsed,完全没有变化。
调试它我发现,在我收到的双击事件之前有另一个事件被触发(或者在我处理它之前某事正在监听它),expanding/collapsing 特定节点。禁用监听器我能够摆脱这种行为。但是当双击标签时,这再次禁用了节点的扩展。
我在调试时在 eclipse 中看到了类似的行为,想知道这是已知错误还是更糟糕的预期行为?
如有任何建议,我们将不胜感激,并在此先致谢!
我可以观察到您在 Windows 7 上描述的问题。某事 expands/collapses 一个项目很可能是本机代码。
虽然我认为这是 SWT 或 Win32 树控件中的一个错误 should be reported 并在 SWT 中修复或解决,但我发现了一个乍一看可行的解决方法。如果您在 Tree
小部件而不是 IDoubleClikListener
小部件上使用 SWT 侦听器,您可以确定是否单击了标签本身或仅单击了 行 和 expand/collapse 项目自己或留给那个 something.
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
}
}
} );
由于此问题可能与平台有关,您应该在所有目标平台上进行测试。