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

标签 java javafx javafx-8 contextmenu

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

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

但是如果您稍后将另一个 TextField 添加到 Scene 中,它的默认上下文菜单不会被禁用。 如果每次添加TextField都运行上面的代码,是没有问题的,但是比较麻烦。

那么有什么方法可以禁用所有TextField(包括后来添加到场景图中的)的默认上下文菜单吗?

最佳答案

CONTEXT_MENU_REQUESTED event可以在它到达目标 Node 之前被添加到 Scene 或添加到包含所有 Parent 的事件过滤器使用不应打开上下文菜单的 TextField:

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;
}

关于java - 如何全局禁用默认上下文菜单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38417440/

相关文章:

JavaFX 事件处理程序 nullpointerException

java - 如何显示 TreeTableView 并将 T 对象列表作为子项

java - 调整 VLCJ PixelWriter 的大小

java - 如何使用 css 在 javafx 中为文本设置动画?

JavaFX 将旋转应用于 CSS 中的图像

java - 如何重新初始化 NumberAxis 并移动到 JavaFX LineChart 中的下一个值?

java - SpringBoot Controller 无法解析名称为 'home' 的 View

java* 将默认屏幕的位置设置为 (0,0)

java - 在异构环境中是否推荐使用hibernate?

java - Spring Boot 程序化日志记录配置