1

所有相关的

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

注意到addSelectionChangedListener()addDoubleClickListener()通过网页: http: //javafact.com/2010/08/07/example-tableviewer-events/ ,我为我添加了SelectionChangedListenerand ,并发现:两个听众中的任何一个都可以工作,但他们不能一起工作——实际上这是行不通的。 DoubleClickListenerTableViwerDoubleClickListener

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

关于代码:我创建了一个 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 的问候和感谢

4

1 回答 1

0

(序言:仍然在这里使用 JFace/SWT,所以这可能会引起某人的兴趣)

问题是 API 允许您执行此操作,但它不起作用(哦 SWT ...)。您不能在 TableView 上同时拥有两个侦听器,因为 SelectionChangedListener 将始终抓住点击并消耗事件。

解决方案是将 SelectionChangedListener 附加到基础,并将 DoubleClickListener 附加到TableViewer。这样你就可以两者兼得,例如:

table.addSelectionChangedListener(new ISelectionChangedListener(...));
tableViewer.addDoubleClickListener(new IDoubleClickListener(...));
于 2015-05-19T08:34:12.197 回答