首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >JavaFX菜单流

JavaFX菜单流
EN

Stack Overflow用户
提问于 2013-11-06 20:34:38
回答 1查看 1.3K关注 0票数 0

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

我试了一次HBox,但没有得到正确的第二菜单。

我尝试使用AnchorPane并将应用程序菜单锚定在左侧,管理菜单位于右侧。这很好,直到你调整它的大小。当显示变得太小,无法同时显示两个菜单时,就会开始截断字母。我要它把第二个菜单包装到下一行。

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

更好的是一个可以自动流动的menuBar,这样我就不需要把它拆开让它绕过去了。但如果有这种能力,我就找不到了。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-06 21:44:42

AFAIK MenuBar不支持包装其Menus。

可以有不同的方法来实现您想要的布局。他们中的一个在下面。

要将第二个管理flowPane对齐到右边,请使用HBox.setHgrow for flowPane。若要在flowPane中对齐菜单栏,请使用flow.setAlignment(Pos.TOP_RIGHT)

代码语言:javascript
运行
复制
@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();
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19822251

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档