TableViewer的“addSelectionChangedListener”和“addDoubleClickListener”的冲突

时间:2013-09-03 18:54:41

标签: java swt jface tableviewer

所有相关的

使用JFace TableViewer,我想通过单击选择一些条目(例如选择文件),然后通过双击执行一些其他操作(例如进入目录)。

通过网页注意addSelectionChangedListener()addDoubleClickListener()http://javafact.com/2010/08/07/example-tableviewer-events/,我为SelectionChangedListener添加DoubleClickListenerTableViwer,并找出: 两个听众中的任何一个都可以工作,但是它们不能一起工作 - 实际上它是DoubleClickListener无法工作的。

有什么问题?我应该如何实现单击和双击的监听器? 任何评论表示赞赏。

关于代码: 我创建了一个tableViewer,并希望显示文件系统结构。 预期的行为:用户可以双击目录条目,tableViewer将显示所选目录的结构;用户通过单击选择一个通用文件。对于其他操作,将显示警告消息对话框。

以下是与事件处理程序相关的代码。

tableView.addSelectionChangedListener( new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
      IStructuredSelection sel = (IStructuredSelection) tableView.getSelection();  
      File selFile = (File) sel.getFirstElement();
      if(selFile != null){
    if (selFile.isDirectory()) {
       MessageDialog.openWarning(getShell(), "Warning", "You select a directory");
               return;
            }
    System.out.println("Selected : "+ selFile.getAbsolutePath());
    selectFileName = selFile.getAbsolutePath();

  }
    }
 });

 tableView.addDoubleClickListener( new IDoubleClickListener() {

@Override
public void doubleClick(DoubleClickEvent arg0) {
   Object selected;
   IStructuredSelection selection = (IStructuredSelection) tableView.getSelection();
   if (selection.size() != 1) return;
   selected = selection.getFirstElement();
   File file = (File) selected;
   if (file.isFile()) {
     MessageDialog.openInformation(getShell(),"Warning", "You double-clicks a generic file");
     return;
   } 
  if (file.isDirectory()) {
    System.out.println("Clicked direcotry: " + file.getAbsolutePath());

    //applyNewDirectory(file);
  }
     }          
   }); 

问候&谢谢 Sunzen

1 个答案:

答案 0 :(得分:0)

(prolog:仍然在这里与JFace / SWT合作,所以这可能是某些人感兴趣的)

问题是API允许你这样做,但它不起作用(哦SWT ......)。 您不能在TableView上同时拥有两个侦听器,因为SelectionChangedListener将始终抓取单击并使用该事件。

解决方案是将SelectionChangedListener附加到基础,将DoubleClickListener附加到 TableViewer 。 这样你可以同时拥有两个,例如:

table.addSelectionChangedListener(new ISelectionChangedListener(...));
tableViewer.addDoubleClickListener(new IDoubleClickListener(...));