我正在爲我的應用程序定製樣式。我目前的問題源於設計師爲菜單欄和菜單項指定完全不同的樣式。我實現了按鈕樣式,但菜單彈出框略微覆蓋了按鈕本身(包括按鈕標籤),這很醜陋。有沒有辦法控制JavaFX 8中的菜單彈出位置?
是否有某種方法可以相對菜單欄按鈕來控制菜單彈出位置?哪些代碼實際上定位了這些彈出窗口?我通過JavaFX源搜索,但javafx.scene.control.Menu
類不處理任何有關上下文菜單 - 似乎菜單邏輯發生在一些完全不同的地方。
我正在爲我的應用程序定製樣式。我目前的問題源於設計師爲菜單欄和菜單項指定完全不同的樣式。我實現了按鈕樣式,但菜單彈出框略微覆蓋了按鈕本身(包括按鈕標籤),這很醜陋。有沒有辦法控制JavaFX 8中的菜單彈出位置?
是否有某種方法可以相對菜單欄按鈕來控制菜單彈出位置?哪些代碼實際上定位了這些彈出窗口?我通過JavaFX源搜索,但javafx.scene.control.Menu
類不處理任何有關上下文菜單 - 似乎菜單邏輯發生在一些完全不同的地方。
我相信彈出菜單是用ContextMenu(與右鍵菜單相同)完成的。你也可以使用CSS來改變位置。您還可以使用ScenicView和SceneBuilder來廣泛調試GUI並找到適當的CSS路徑(如果您尚未這樣做)。
相關的CSS類可以在這裏找到How can I style a JavaFX menu and its items in CSS?和填充和邊距可以用來移動上下文菜單。
退房default CSS style叫做摩德納。 1166行是菜單開始的地方。
希望這會有所幫助。
UPDATE:
事實證明,上下文菜單,菜單按鈕的底部彈出。據我所知,沒有辦法通過CSS移動實際的節點。
這意味着,因爲它與你重疊,菜單按鈕不如菜單欄那麼大,如果將菜單按鈕設置爲與菜單欄一樣大(正如我在圖片中所做的那樣),它將顯示在菜單欄下方。
正如你所看到的,我不是在菜單欄上使用填充,而是在菜單按鈕上使用它。這會自動調整菜單欄的大小,並使菜單彈出完美。
我也刪除了顏色,告訴你它是完全透明的,如果你刪除顏色。
-fx-effect: null;
還刪除默認的陰影效果。如果您想對此進行更廣泛的控制,您需要實現自己的菜單按鈕和自己的上下文菜單。只有這樣,你才能完全控制。
用於顯示彈出位於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));
是的,使用CSS將是理想的。但是如何?我知道-fx-padding,但是我無法在文檔的任何位置找到-fx-margin。 – Rogach
-fx-margin實際上是insets。例如,-fx-background-insets。我相信那是你想使用的那個。 – Limnic
我嘗試過-fx-background-insets,但它沒有幫助 - 彈出窗口仍然牢牢地位於同一個地方。 – Rogach