区分 CheckboxTreeViewers CheckStateListener 和选择监听器

Differentiating between a CheckboxTreeViewers CheckStateListener and Selection Listener

我正在尝试以编程方式确定用户何时单击了 CheckboxTreeViewer 中的复选框以及何时单击了树中的实际对象(即直接显示在复选框右侧的项目)

为了确定复选框何时 checked/unchecked 我使用了 CheckStateListener。这按预期工作。

为了确定一个对象是否被点击,我尝试使用选择侦听器和鼠标按下侦听器。正如预期的那样,两者都记录了一个对象已被单击。然而,当一个复选框被 checked/unchecked 时,他们也会记录。我无法判断是哪个操作(单击复选框还是单击对象)导致听众触发。

是否有更好的方法来确定用户点击了什么?

谢谢!

编辑。这是我正在测试的当前代码(添加到 SWT.MouseDown 事件):

private Listener getTestListener() {
    return new Listener() {
        @Override
        public void handleEvent(final Event event) {
            final ViewerCell vc = treeViewer.getCell(new 
                Point(event.x, event.y));
            if (vc != null) {
                IStructuredSelection selection = 
                   (IStructuredSelection)treeViewer.getSelection();
                Object selObj = selection.getFirstElement();

                final Object element = vc.getElement();

                // When I click on the checkbox or on the item 
                // to the right of it, the selObj and element 
                // Objects are always the same
            }
        }
    };
}

还使用 Select 进行了测试: treeViewer.getTree().addSelectionListener(getTestListener2()); ...

private SelectionListener getTestListener2() {
    return new SelectionListener() {
        @Override
        public void widgetSelected(SelectionEvent e) {
            IStructuredSelection selection = (IStructuredSelection)treeViewer.getSelection();
            Object selObj = selection.getFirstElement();
        }

        @Override
        public void widgetDefaultSelected(SelectionEvent e) {
        }
    };
}

这在 e 和 selObj 之间也产生了相同的结果

更新:

我不得不做一个可怕的解决方法,我得到 event.x 值,树节点的级别并做 OS-特定的数学来确定鼠标是否在复选框上.我希望有更好的方法...

如果您从table获得当前选择,而不是选择事件时似乎没有更改的选择事件。

因此它将为空或之前选择的元素,并且与您从事件中获得的选择不匹配。

这是在 Mac OS X 上进行测试。我不确定此行为是否适用于所有平台。

您可以从树或 table 查看器中获取当前选择:

IStructuredSelection selection = (IStructuredSelection)viewer.getSelection();

Object selObj = selection.getFirstElement();