有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

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

但是,如果您稍后将另一个TextField添加到Scene,则其默认上下文菜单不会被禁用。 如果每次添加TextField时都运行上面的代码,就不会有问题,但这相当麻烦

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


共 (2) 个答案

  1. # 1 楼答案

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

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

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

  2. # 2 楼答案

    ^{} event可以在到达目标Node之前被添加到Scene或包含所有不应打开上下文菜单的TextFieldParent的事件筛选器使用:

    scene.addEventFilter(ContextMenuEvent.CONTEXT_MENU_REQUESTED, evt -> {
        if (checkTextField((Node) evt.getTarget())) {
            evt.consume();
        }
    });
    
    // check, if the node is part of a TextField
    public static boolean checkTextField(Node node) {
        while (node != null) {
            if (node instanceof TextField) {
                return true;
            }
            node = node.getParent();
        }
        return false;
    }