如何检测双击 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);