在Java中,我有一个TreeViewer,我试图检测特定单元格(而不是任何单元格)上的点击。例如,如果我单击一行中的第一个单元格,我想检测到特别是在第一个单元格上进行了单击。
以下代码将在我双击一行时立即触发事件,它将返回有关该行的所有信息。当我只双击特定单元格(即特定的行和列)时,如何确保它只会触发双击事件。
viewer = new TreeViewer(parent, SWT.BORDER | SWT.FULL_SELECTION);
viewer.addDoubleClickListener(new IDoubleClickListener() {
@Override
public void doubleClick(DoubleClickEvent event) {
IStructuredSelection thisSelection = (IStructuredSelection) event.getSelection();
Object selectedNode = thisSelection.getFirstElement();
System.out.println(selectedNode.toString());
}
});
修改
greg-449是对的。 getFirstElement方法没有row或col属性。以下是greg-449问题的答案,为什么我不使用单元格编辑支持。事实上,我正在使用其中一个列的单元格版本支持。请查看以下树结构:
October
|__(Report 1)(Forecast revenue)(Actual revenue <-- editable)
|__(Report 2)(Forecast revenue)(Actual revenue <-- editable)
November
|__(Report 1)(Forecast revenue)(Actual revenue <-- editable)
|__(Report 2)(Forecast revenue)(Actual revenue <-- editable)
December
|__(Report 1)(Forecast revenue)(Actual revenue <-- editable)
|__(Report 2)(Forecast revenue)(Actual revenue <-- editable)
|__(Report 3)(Forecast revenue)(Actual revenue <-- editable)
在上面的TreeView中,我有3个主要栏目:报告,预测收入和实际收入。实际收入是一个可编辑的列,允许用户输入值,这是我使用单元格编辑支持的列。现在当用户在12月双击“报告3”的单元格时,我想在12月的选项卡上打开与报告3相关的相应pdf文件。基本上,我想将第1列(报告)视为双击按钮来执行与该特定单元格相对应的操作。当用户点击或双击第2列“预测收入”时,它不应执行任何操作。当用户点击第3列“实际收入”时,他可以输入实际值。使用我的第一个帖子中提到的viewer.addDoubleClickListener(新的IDoubleClickListener(){...},当用户双击第2列或第2列时3,它打开pdf文件,这不是我想要的!另外,我试图使用单元格编辑支持第一列“报告”。如果我将canEdit设置为true,则第一列变为可编辑。如果我将canEdit设置为false,没有任何反应。我不想编辑第1列。我只想检测双击事件!我希望这次我已经清楚了。请提前感谢...
答案 0 :(得分:0)
要检测双击TreeView中的特定单元格,这里有一个可能的解决方案,它基于在Internet上找到的TreeView中显示单元格提示的想法。 我犯的错误是使用了viewer.addDoubleClickListener(新的IDoubleClickListener(){..}。
Listener treeListener = new Listener () {
@Override
public void handleEvent (Event event) {
switch (event.type) {
case SWT.MouseDoubleClick: {
Point coords = new Point(event.x, event.y);
TreeItem item = viewer.getTree().getItem(coords);
if (item != null) {
int columns = viewer.getTree().getColumnCount();
for (int i = 0; i < columns; i++) {
if (item.getBounds(i).contains(coords)) {
System.out.println("Double Clicked on: " + item.getData() + " : " + i);
}
}
}
}
}
}
};
viewer.getTree().addListener (SWT.MouseDoubleClick, treeListener);
答案 1 :(得分:0)
哇,这很有帮助,我遇到了同样的问题!
然而,viewer.getTree() 部分对我不起作用,但我通过一些小的调整设法得到了结果。
另外,我添加了一些代码来显示双击单元格的内容。
Listener doubleClickListener = new Listener () {
@Override
public void handleEvent (Event event) {
if (event.type == SWT.MouseDoubleClick) {
Point coords = new Point(event.x, event.y);
TableItem item = tableViewer.getTable().getItem(coords);
if (item != null) {
int columns = tableViewer.getTable().getColumnCount();
for (int i = 0; i < columns; i++) {
if (item.getBounds(i).contains(coords)) {
if (item.getData() != null) {
@SuppressWarnings("unchecked")
ArrayList<String> row = (ArrayList<String>)item.getData();
if (row.get(i) != null)
System.out.println("Cell contain: " + row.get(i));
}
}
}
}
}
}
};
tableViewer.getTable().addListener (SWT.MouseDoubleClick, doubleClickListener);
答案 2 :(得分:-1)
事件将始终触发,您应该查看selectedNode对象的属性,并检查它是否具有任何col和row属性。 然后你就做了类似的事情:
if(selectedNode.row == theRowYouWant && selectedNode.col == theColYouWant) {
// do something.
}