2014-01-12 42 views
0

我正在开发自定义TreeView对象。 我正在使用自定义cellFactory来提供我的TreeView的TreeCell对象。 这使我可以在各种单元上安装自定义上下文菜单,具体取决于它们显示的项目。防止从右键单击树视图单元格选择树单元格

但我对这种行为并不完全满意。

当左键点击单元格时,它被选中(OK) 但是,当右键点击单元格时,会显示上下文菜单(确定),但是单元格也会被选中。 (NOK)

我该如何改变这种行为?

我试图在树视图上实现一个eventFilter,以消耗该事件,如果它是一个右键单击但这不会改变任何东西,上述行为仍然适用。

addEventFilter(MouseEvent.MOUSE_CLICKED, 
       new EventHandler<MouseEvent>() { 
        @Override 
        public void handle(MouseEvent event) { 
         if (event.getButton() == MouseButton.SECONDARY) { 
          event.consume(); 
         } 
        } 
       }); 

setCellFactory(new Callback<TreeView<TreeDisplayable>, TreeCell<TreeDisplayable>>() { 
      @Override 
      public TreeCell<TreeDisplayable> call(
        final TreeView<TreeDisplayable> treeView) { 
       return new TreeDisplayableTreeCell(owner, javaModel); 
      } 
     }); 



public class TreeDisplayableTreeCell extends TreeCell<TreeDisplayable> { 
... 
    @Override 
    public void updateItem(TreeDisplayable item, boolean empty) { 
     super.updateItem(item, empty); 
     if (empty) { 
      setText(null); 
      setGraphic(null); 
     } else { 
      setText(getItem().treeViewString()); 
      setGraphic(item.getPic()); 
      if (getTreeItem().getParent() == null) { 
       // it means it's the root node 
       setContextMenu(new RootItemContextMenu(javaModel, owner)); 
      } else { 
       setContextMenu(new TreeItemContextMenu(javaModel, owner,getTreeItem().getValue())); 
      } 
     } 
    } 
} 
+0

在标准的Windows控件中,有一个属性用于启用右键单击选择,默认为false。看起来你的事件过滤器在这个过程中已经太晚了,你需要走上组件层次结构并找到执行选择的代码。 –

回答

0

起反应Tony的评论

创建自定义此事件的伎俩。

public class TreeEventDispatcher implements EventDispatcher { 

    @Override 
    public Event dispatchEvent(Event event, EventDispatchChain tail) { 
     if (event instanceof MouseEvent) { 
      MouseEvent mouseEvent = (MouseEvent) event; 
      if (mouseEvent.getButton() == MouseButton.SECONDARY) { 
       event.consume(); 
      } else { 
       event = tail.dispatchEvent(event); 
      } 
     } else { 
      event = tail.dispatchEvent(event); 
     } 
     return event; 
    } 

} 

的行为对于所有事件相同,除了右击事件,该事件被消耗,从而防止任何TreeCell的右击选择。

幸运的是,上下文菜单仍然显示在右键点击(虽然我不明白为什么......)有没有人有线索?

相关问题