0

我有一个应用程序,顶部有两个菜单栏(应用程序菜单和管理菜单),它们之间有一个搜索框。第一个菜单栏左对齐,搜索框紧随其后,而第二个菜单右对齐。这为其他应用程序菜单留出了空间,而无需移动管理菜单。

我尝试了 HBox,但无法正确设置第二个菜单。

我尝试使用 AnchorPane 并将应用程序菜单锚定在左侧,将管理菜单锚定在右侧。这工作正常,直到你调整它。当显示屏变得太小而无法显示两个菜单时,它开始截断字母。我希望它将第二个菜单包装到下一行。

我尝试使用 FlowPane,它非常适合在调整大小时让一个在另一个下方流动,但我无法让第二个菜单可靠正确。我尝试了将监听器放在父宽度上并计算要使用的 hgap 的技巧,但是第一次调用它时,菜单栏的大小为 0,因此 hgap 对于实际菜单来说太大了。在我调整它一次之后,这个技巧很有效。

更好的是可以自动流动的菜单栏,这样我就不必分解它来让它环绕。但如果这种能力存在,我一直找不到它。

4

1 回答 1

1

AFAIKMenuBar不支持包装其Menus.
可以有不同的方法来实现您想要的布局。其中之一在下面。
要将第二个管理 flowPane 向右对齐,请使用HBox.setHgrowflowPane。要在 flowPane 中对齐菜单栏,请使用flow.setAlignment(Pos.TOP_RIGHT)

@Override
public void start(Stage primaryStage) {

    final Menu menu01 = new Menu("App Menu 1");
    final Menu menu02 = new Menu("App Menu 2");
    final Menu menu1 = new Menu("Admin Menu 1");
    final Menu menu2 = new Menu("Admin Menu 2");
    final Menu menu3 = new Menu("Admin Menu 3");

    MenuBar menuBar0 = new MenuBar();
    menuBar0.getMenus().addAll(menu01, menu02);
    menuBar0.setMinWidth(220); // do not shrink

    MenuBar menuBar1 = new MenuBar();
    menuBar1.getMenus().addAll(menu1);

    MenuBar menuBar2 = new MenuBar();
    menuBar2.getMenus().addAll(menu2);

    MenuBar menuBar3 = new MenuBar();
    menuBar3.getMenus().addAll(menu3);

    FlowPane flow = new FlowPane(Orientation.HORIZONTAL);
    // flow.setStyle("-fx-background-color: gray; -fx-border-color: red");  // visual debug
    flow.setAlignment(Pos.TOP_RIGHT);
    flow.setHgap(0);
    flow.getChildren().addAll(menuBar1, menuBar2, menuBar3);

    TextField searchField = new TextField();
    searchField.setPromptText("Search here..");
    // make it unresizable
    searchField.setMinWidth(200);
    searchField.setMaxWidth(200);

    HBox mainBox = new HBox(5);
    mainBox.setAlignment(Pos.CENTER_LEFT);
    HBox.setHgrow(flow, Priority.ALWAYS);
    mainBox.getChildren().addAll(menuBar0, searchField, flow);
    mainBox.setStyle("-fx-background-color: lightgray;");

    VBox vBox = new VBox(0);
    vBox.getChildren().addAll(mainBox, new Button("Demo"));

    Scene scene = new Scene(vBox);
    primaryStage.setScene(scene);
    primaryStage.show();
}
于 2013-11-06T21:44:42.750 回答