有没有办法控制JavaFX 8中的菜单弹出位置?

时间:2015-09-14 22:41:43

标签: java javafx-8

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

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

3 个答案:

答案 0 :(得分: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移动实际节点。

这意味着,因为它与你的重叠,菜单按钮没有你的菜单栏那么大,如果你把它设置为你的菜单栏(就像我在图片中所做的那样大),它将在菜单栏下完美呈现。

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

我还删除了颜色,以便在删除颜色时显示它是完全透明的。

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

-fx-effect: null;也会删除默认的阴影效果。如果您想对此进行更广泛的控制,则需要实现自己的菜单按钮和自己的上下文菜单。只有这样,你才能完全掌控。

答案 1 :(得分:2)

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

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

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

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

menuButton.setSkin(new TweakedMenuButtonSkin(menuButton));

答案 2 :(得分:1)

您不需要复制整个皮肤。如果扩展皮肤,则可以相当轻松地更改此设置(即使该方法是私有的)。只需复制以下内容即可...。(在“显示”方法中将位置更改为所需的位置)

@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);
    }
}
相关问题