2015-03-31 49 views
3

我一直無法在JavaFX Menu類中找到API,這將允許我檢索父MenuBar。任何提示,包括使用內部API都非常受歡迎。 (JavaFX 8)如何獲得JavaFX菜單的父MenuBar

背景:通常,任何JavaFX Node都可以通過方法getParent()爲您提供它的父項。但由於MenuMenuItem不從Node繼承,此可能性不可用。該MenuItem類(因此也Menu類)有兩個類似的方法:

  • getParentPopup()得到父母ContentMenu
  • getParentMenu()得到父母Menu

所以我本來期望像getParentMenuBar(),但它不在那裏。

編輯:我剛剛發現這個API擴展了JIRA功能要求: https://bugs.openjdk.java.net/browse/JDK-8091154

有沒有人找到解決類似的問題?

+0

您的應用程序是以編程方式構建還是通過FXML構建? – Adam 2015-03-31 19:23:44

+0

我們使用FXML作爲UI的最大部分。 – 2015-04-01 07:35:32

回答

1

我會問你爲什麼需要訪問從菜單返回到MenuBar,你想解決什麼問題?

一個可能的方法是使用節點上的arbitrary properties map來存儲從Menu到MenuBar的引用,如本例所示。

public class MenuToMenuBar extends Application { 
    public static void main(String args[]) { 
     launch(args); 
    } 

    @Override 
    public void start(Stage stage) throws Exception { 
     MenuBar bar = new MenuBar(); 
     stage.setScene(new Scene(bar)); 
     Menu menu = new Menu("Foo"); 

     MenuItem menuItem = new MenuItem("Baz"); 
     menu.getItems().add(menuItem); 
     bar.getMenus().add(menu); 

     // put a reference back to MenuBar in each Menu 
     for (Menu each : bar.getMenus()) { 
      each.getProperties().put(MenuBar.class.getCanonicalName(), bar); 
     } 

     menuItem.setOnAction((e) -> { 
      // retrieve the MenuBar reference later... 
      System.out.println(menuItem.getParentMenu().getProperties().get(MenuBar.class.getCanonicalName())); 
     }); 
     stage.show(); 
    } 
} 
+0

是的,我可以通過構建自己的映射來解決問題。因爲我們使用fxml,我們需要做一些後處理:1)走場景圖並找到'MenuBar'實例,然後2)在'MenuBar.getMenus()'上掛接一個監聽器來保存關係。 (如果你真的對我爲什麼需要這樣做感興趣,我們應該就此進行一場私人討論,否則會混淆這個問題。當然,我們也正在評估其他可能的解決方案,所有這些都有自己的缺陷。) – 2015-04-01 07:57:16