如何全局禁用默认上下文菜单

时间:2016-07-17 02:45:40

标签: java javafx javafx-8 contextmenu

以下代码禁用添加到TextField的所有现有Scene的默认上下文菜单。

for (Node node : scene.getRoot().lookupAll("*")) {
  if (node instanceof TextField) {
    ((TextField)node).setContextMenu(new ContextMenu());
  }
}

但是如果稍后再向TextField添加Scene,则不会禁用其默认上下文菜单。 如果你每次添加TextField时运行上面的代码,就没有问题,但是这很麻烦。

那么有没有办法禁用所有TextField的默认上下文菜单(包括稍后在场景图中添加的菜单)?

2 个答案:

答案 0 :(得分:2)

CONTEXT_MENU_REQUESTED event可以通过添加到Node的事件过滤器或包含所有{{1的Scene到达目标Parent之前消耗s不应该打开上下文菜单:

TextField
scene.addEventFilter(ContextMenuEvent.CONTEXT_MENU_REQUESTED, evt -> {
    if (checkTextField((Node) evt.getTarget())) {
        evt.consume();
    }
});

答案 1 :(得分:1)

您可以使用CSS删除TextField个对象的上下文菜单:

.text-field * .context-menu { 
    visibility: hidden;
}

.text-field * .context-menu > .scroll-arrow {
    -fx-opacity: 0;
}   

第一个样式类本身隐藏ContextMenu。第二个隐藏了小箭头。