如何检测双击 TreeViewer 中的特定单元格
How to detect a double click on a specific cell in TreeViewer
在 Java 中,我有一个 TreeViewer,我正在尝试检测对特定单元格(不是任何单元格)的点击。例如,如果我点击了一行中的第一个单元格,我想特别检测到点击是在第一个单元格上进行的。
只要我双击一行,下面的代码就会触发一个事件,它会 return 关于该行的所有信息。当我只双击特定的单元格(即特定的行和列)时,如何确保它只会触发双击事件。
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 方法没有行或列属性。这是 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 个主要列:报告、预测收入和实际收入。实际收入是一个可编辑的列,允许用户输入一个值,这就是我使用单元格编辑支持的列。现在,当用户双击 "Report 3" in December 的单元格时,我想在选项卡上打开与 report 3 in December 相关的相应 pdf 文件。基本上,我想将第 1 列(报告)视为双击按钮来执行与该特定单元格相对应的操作。当用户单击或双击第 2 列 "Forecast revenue" 时,它不应执行任何操作。当用户点击第 3 列“实际收入”时,他可以输入实际值。使用 viewer.addDoubleClickListener(new IDoubleClickListener() {...} 在我的第一个线程中提到,当用户双击第 2 列时或第 3 列,它打开 pdf 文件,这不是我想要的!此外,我尝试使用第一列的单元格编辑支持 "Report"。如果我将 canEdit 设置为 true,第一列变为可编辑。如果我将 canEdit 设置为 false,什么也不会发生。我不想编辑第 1 列。我只想检测双击事件!我希望这次我已经说清楚了。提前致谢...
事件总是会触发,您应该查看所选节点对象的属性,并检查它是否具有任何 col 和 row 属性。
然后您只需执行以下操作:
if(selectedNode.row == theRowYouWant && selectedNode.col == theColYouWant) {
// do something.
}
要检测 TreeView 中特定单元格上的 double-click,这里有一个可能的解决方案,它基于在 Internet 上找到的 TreeView 中显示单元格提示的想法。
我犯的错误是使用 viewer.addDoubleClickListener(new 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);
哇,这帮了大忙,我也遇到了同样的问题!
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);
在 Java 中,我有一个 TreeViewer,我正在尝试检测对特定单元格(不是任何单元格)的点击。例如,如果我点击了一行中的第一个单元格,我想特别检测到点击是在第一个单元格上进行的。
只要我双击一行,下面的代码就会触发一个事件,它会 return 关于该行的所有信息。当我只双击特定的单元格(即特定的行和列)时,如何确保它只会触发双击事件。
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 方法没有行或列属性。这是 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 个主要列:报告、预测收入和实际收入。实际收入是一个可编辑的列,允许用户输入一个值,这就是我使用单元格编辑支持的列。现在,当用户双击 "Report 3" in December 的单元格时,我想在选项卡上打开与 report 3 in December 相关的相应 pdf 文件。基本上,我想将第 1 列(报告)视为双击按钮来执行与该特定单元格相对应的操作。当用户单击或双击第 2 列 "Forecast revenue" 时,它不应执行任何操作。当用户点击第 3 列“实际收入”时,他可以输入实际值。使用 viewer.addDoubleClickListener(new IDoubleClickListener() {...} 在我的第一个线程中提到,当用户双击第 2 列时或第 3 列,它打开 pdf 文件,这不是我想要的!此外,我尝试使用第一列的单元格编辑支持 "Report"。如果我将 canEdit 设置为 true,第一列变为可编辑。如果我将 canEdit 设置为 false,什么也不会发生。我不想编辑第 1 列。我只想检测双击事件!我希望这次我已经说清楚了。提前致谢...
事件总是会触发,您应该查看所选节点对象的属性,并检查它是否具有任何 col 和 row 属性。 然后您只需执行以下操作:
if(selectedNode.row == theRowYouWant && selectedNode.col == theColYouWant) {
// do something.
}
要检测 TreeView 中特定单元格上的 double-click,这里有一个可能的解决方案,它基于在 Internet 上找到的 TreeView 中显示单元格提示的想法。 我犯的错误是使用 viewer.addDoubleClickListener(new 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);
哇,这帮了大忙,我也遇到了同样的问题!
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);