区分 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();
我正在尝试以编程方式确定用户何时单击了 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();