我正在为我的应用程序设计自定义样式。我目前的问题源于设计师为菜单栏和菜单项指定了完全不同的样式。我实现了按钮样式,但菜单弹出窗口现在稍微覆盖了按钮本身(包括按钮标签),这很难看。
有没有办法控制菜单弹出位置相对于菜单栏按钮?实际定位弹出窗口的代码在哪里?我搜索了JavaFX源代码,但javafx.scene.control.Menu
类没有处理与上下文菜单相关的任何内容 - 似乎菜单逻辑发生在一些完全不同的地方。
答案 0 :(得分:2)
我相信菜单中的弹出窗口是使用ContextMenu完成的(与右键菜单相同)。您还可以使用CSS更改位置。您还可以使用ScenicView和SceneBuilder来广泛地调试GUI并找到合适的CSS路径(如果您还没有这样做)。
可以在此处找到相关的css类How can I style a JavaFX menu and its items in CSS?,并且可以使用填充和边距来移动上下文菜单。
查看名为Modena的default CSS style。第1166行是菜单内容开始的地方。
希望这有帮助。
<强>更新强>
事实证明,菜单按钮的底部会弹出上下文菜单。据我所知,没有办法通过CSS移动实际节点。
这意味着,因为它与你的重叠,菜单按钮没有你的菜单栏那么大,如果你把它设置为你的菜单栏(就像我在图片中所做的那样大),它将在菜单栏下完美呈现。
正如您所看到的,我不是在菜单栏上使用填充,而是在菜单按钮上使用它。这将自动调整菜单栏的大小,并使上下文菜单完美地弹出。
我还删除了颜色,以便在删除颜色时显示它是完全透明的。
-fx-effect: null;
也会删除默认的阴影效果。如果您想对此进行更广泛的控制,则需要实现自己的菜单按钮和自己的上下文菜单。只有这样,你才能完全掌控。
答案 1 :(得分:2)
显示弹出窗口的实际代码位于MenuButtonSkinBase:
private void show() {
if (!popup.isShowing()) {
popup.show(getSkinnable(), getSkinnable().getPopupSide(), 0, 0);
}
}
popup.show
的最后两个参数是弹出窗口的X和Y偏移量。不幸的是,由于某种原因,方法被标记为私有,因此不可能简单地创建MenuButtonSkin
的子类并覆盖该方法。
一种可能的解决方案是将代码从MenuButtonSkinBase
和MenuButtonSkin
复制粘贴到您自己的文件中(大约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);
}
}