区分CheckboxTreeViewers CheckStateListener和Selection Listener

时间:2015-06-01 16:58:46

标签: java swt jface

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

要确定何时选中/取消选中复选框,我使用CheckStateListener。这可以按预期工作。

要确定是否已单击某个对象,我已尝试同时使用选择侦听器和mousedown侦听器。两者都按预期记录了单击对象的情况。但是,它们也会在选中/取消选中复选框时进行记录。我无法告诉哪个操作(单击复选框与单击对象)导致侦听器触发。

有没有更好的方法来确定用户点击的内容?

谢谢!

EDIT。这是我测试的当前代码(添加到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值,树节点的级别,并执行特定于操作系统的数学,以确定鼠标是否在复选框上。我希望有更好的方式...

1 个答案:

答案 0 :(得分:0)

如果您从表中获取当前选择而不是选择更改事件,当选择事件用于单击复选框时似乎没有更改。

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

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

您可以使用以下内容从树或表格查看器中获取当前选择:

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

Object selObj = selection.getFirstElement();