我正在尝试以编程方式确定用户何时单击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值,树节点的级别,并执行特定于操作系统的数学,以确定鼠标是否在复选框上。我希望有更好的方式...
答案 0 :(得分:0)
如果您从表中获取当前选择而不是选择更改事件,当选择事件用于单击复选框时似乎没有更改。
因此它将为空或之前选择的元素,并且与您从事件中获得的选择不匹配。
这是在Mac OS X上进行的测试。我不确定这种行为是否适用于所有平台。
您可以使用以下内容从树或表格查看器中获取当前选择:
IStructuredSelection selection = (IStructuredSelection)viewer.getSelection();
Object selObj = selection.getFirstElement();