2015-09-14 72 views
2

我正在爲我的應用程序定製樣式。我目前的問題源於設計師爲菜單欄和菜單項指定完全不同的樣式。我實現了按鈕樣式,但菜單彈出框略微覆蓋了按鈕本身(包括按鈕標籤),這很醜陋。有沒有辦法控制JavaFX 8中的菜單彈出位置?

是否有某種方法可以相對菜單欄按鈕來控制菜單彈出位置?哪些代碼實際上定位了這些彈出窗口?我通過JavaFX源搜索,但javafx.scene.control.Menu類不處理任何有關上下文菜單 - 似乎菜單邏輯發生在一些完全不同的地方。

回答

2

我相信彈出菜單是用ContextMenu(與右鍵菜單相同)完成的。你也可以使用CSS來改變位置。您還可以使用ScenicViewSceneBuilder來廣泛調試GUI並找到適當的CSS路徑(如果您尚未這樣做)。

相關的CSS類可以在這裏找到How can I style a JavaFX menu and its items in CSS?和填充和邊距可以用來移動上下文菜單。

退房default CSS style叫做摩德納。 1166行是菜單開始的地方。

希望這會有所幫助。

UPDATE:

這裏是我的測試:enter image description here

事實證明,上下文菜單,菜單按鈕的底部彈出。據我所知,沒有辦法通過CSS移動實際的節點。

這意味着,因爲它與你重疊,菜單按鈕不如菜單欄那麼大,如果將菜單按鈕設置爲與菜單欄一樣大(正如我在圖片中所做的那樣),它將顯示在菜單欄下方。

正如你所看到的,我不是在菜單欄上使用填充,而是在菜單按鈕上使用它。這會自動調整菜單欄的大小,並使菜單彈出完美。

我也刪除了顏色,告訴你它是完全透明的,如果你刪除顏色。

正如你可以在這裏看到: enter image description here

-fx-effect: null;還刪除默認的陰影效果。如果您想對此進行更廣泛的控制,您需要實現自己的菜單按鈕和自己的上下文菜單。只有這樣,你才能完全控制。

+0

是的,使用CSS將是理想的。但是如何?我知道-fx-padding,但是我無法在文檔的任何位置找到-fx-margin。 – Rogach

+0

-fx-margin實際上是insets。例如,-fx-background-insets。我相信那是你想使用的那個。 – Limnic

+0

我嘗試過-fx-background-insets,但它沒有幫助 - 彈出窗口仍然牢牢地位於同一個地方。 – Rogach

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)); 
相關問題