Layout JavaFX菜单流

Layout JavaFX菜单流,layout,javafx-2,Layout,Javafx 2,我有一个应用程序,上面一行有两个菜单栏(应用程序菜单和管理菜单),中间有一个搜索框。第一个菜单栏左对齐,搜索框紧跟其后,而第二个菜单右对齐。这样就为附加的应用程序菜单留出了空间,而无需移动管理菜单 我试过HBox,但第二份菜单没法调整好 我尝试使用AnchorPane,将应用程序菜单锚定到左侧,将管理菜单锚定到右侧。在您调整其大小之前,此功能可以正常工作。当显示器太小而无法同时显示两个菜单时,它将开始截断字母。我希望它将第二个菜单换行到下一行 我试着使用一个FlowPane,当调整大小时,它可以

我有一个应用程序,上面一行有两个菜单栏(应用程序菜单和管理菜单),中间有一个搜索框。第一个菜单栏左对齐,搜索框紧跟其后,而第二个菜单右对齐。这样就为附加的应用程序菜单留出了空间,而无需移动管理菜单

我试过HBox,但第二份菜单没法调整好

我尝试使用AnchorPane,将应用程序菜单锚定到左侧,将管理菜单锚定到右侧。在您调整其大小之前,此功能可以正常工作。当显示器太小而无法同时显示两个菜单时,它将开始截断字母。我希望它将第二个菜单换行到下一行

我试着使用一个FlowPane,当调整大小时,它可以很好地让一个菜单在另一个菜单下流动,但是我无法正确地调整第二个菜单。我尝试了一个技巧,将侦听器放置在父宽度上,并计算要使用的hgap,但第一次调用它时,菜单栏的大小为0,因此hgap对于实际的菜单来说太大了。在我重新调整它的大小一次后,这个技巧效果很好


更好的方法是一个菜单栏,它可以自动流动,这样我就不必把它拆开,让它环绕。但是如果该功能存在,我就无法找到它。

AFAIK
MenuBar
不支持包装其
菜单。
可以有不同的方法来实现您想要的布局。其中一个在下面。
要将第二个管理流程窗格向右对齐,请对流程窗格使用
HBox.setHgrow
。要对齐flowPane中的菜单栏,请使用
flow.setAlignment(右上方)


除了菜单栏不支持对齐属性外,这将非常好。我检查了fxml、代码和文档。@kithril,实际上是flowPane而不是menuBar。用示例代码编辑了答案,以演示我从您的描述中理解的布局。谢谢。现在我知道它是怎么工作的了。我没有考虑Hbox .SthGuilder()和Hbox对齐方式会做这件事。你可以在场景生成器和布局部分中定义控件,你可以设置它们的约束。然后,如果你从窗口中最大化窗口,就不会出现问题,对于小尺寸,你需要使用窗格和控件的WithTrimeType()。
@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();
}