有 Java 编程相关的问题?

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

java在JavaFX8中有没有控制菜单弹出位置的方法?

我正在为我的应用程序定制样式。我目前的问题源于设计师为菜单栏和菜单项指定了完全不同的样式。我实现了按钮样式,但是菜单弹出现在稍微覆盖了按钮本身(包括按钮标签),这很难看

是否有一些方法可以控制相对于菜单栏按钮的菜单弹出位置?实际定位这些弹出窗口的代码在哪里?我搜索了JavaFX源代码,但javafx.scene.control.Menu类并没有处理任何与上下文菜单相关的内容——似乎菜单逻辑发生在完全不同的地方


共 (3) 个答案

  1. # 1 楼答案

    你不需要复制整个皮肤。如果您扩展皮肤,您可以相当容易地更改它(即使该方法是私有的)。只需复制粘贴以下内容。。。。(在“show”方法中将位置更改为您想要的任何位置)

    @Override
    protected void handleControlPropertyChanged(String p) {
        if ("SHOWING".equals(p)) {
            if (getSkinnable().isShowing()) {
                show();
            } else {
                super.handleControlPropertyChanged(p);
            }
        } else {
            super.handleControlPropertyChanged(p);
        }
    }
    
    
    private void show() {
        if (!popup.isShowing()) {
            popup.show(getSkinnable(), getSkinnable().getPopupSide(), 100, 100);
        }
    }
    
  2. # 2 楼答案

    我相信菜单中的弹出窗口是用ContextMenu完成的(与右键单击菜单相同)。您还可以使用CSS更改位置。您还可以使用ScenicViewSceneBuilder广泛地调试GUI并找到适当的CSS路径(如果您还没有这样做的话)

    相关的css类可以在这里找到How can I style a JavaFX menu and its items in CSS?,填充和边距可以用来移动上下文菜单

    查看名为Modena的default CSS style。第1166行是菜单开始的地方

    希望这有帮助

    更新:

    这是我的测试:enter image description here

    结果,上下文菜单在菜单按钮的底部弹出。据我所知,没有办法通过CSS移动实际节点

    这意味着,由于菜单按钮与菜单栏重叠,因此菜单按钮没有菜单栏大,如果将其设置为菜单栏大(如图中所示),它将完全显示在菜单栏下

    正如您所看到的,我在菜单按钮上使用填充,而不是在菜单栏上使用填充。这将自动调整菜单栏的大小,并使contextmenu弹出到位

    我还删除了颜色,以显示如果删除颜色,它是完全透明的

    正如你在这里看到的: enter image description here

    -fx-effect: null;也会删除默认的阴影效果。如果您想更广泛地控制它,您需要实现自己的菜单按钮和上下文菜单。只有到那时,你才能拥有完全的控制权

  3. # 3 楼答案

    显示弹出窗口的实际代码位于MenuButtonSkinBase中:

    private void show() {
        if (!popup.isShowing()) {
            popup.show(getSkinnable(), getSkinnable().getPopupSide(), 0, 0);
        }
    }
    

    popup.show的最后两个参数是弹出窗口的X和Y偏移量。不幸的是,由于某种原因,方法被标记为private,所以不可能简单地创建MenuButtonSkin的子类并重写该方法

    一种可能的解决方案是将粘贴代码从MenuButtonSkinBaseMenuButtonSkin复制到您自己的文件(大约300行代码)中,并在其中调整方法。之后,您将能够执行以下操作:

    menuButton.setSkin(new TweakedMenuButtonSkin(menuButton));