如何检测TreeViewer中特定单元格的双击

时间:2018-03-21 13:19:30

标签: java events treeview jface rcp

在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列。我只想检测双击事件!我希望这次我已经清楚了。请提前感谢...

3 个答案:

答案 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.
}