我的应用程序在顶行上有两个菜单栏(应用程序菜单和管理菜单),在它们之间有一个搜索框。第二个菜单右对齐时,第一个菜单栏左对齐,搜索框紧随其后。这为其他应用程序菜单留出了空间,而无需移动管理菜单。
我尝试了一个HBox,但无法让第二个菜单正确。
我尝试使用AnchorPane并将应用程序菜单固定在左侧,将管理菜单固定在右侧。这可以正常工作,直到你调整它。当显示器太小而无法显示两个菜单时,它会开始截断字母。我希望它将第二个菜单包装到下一行。
我尝试使用FlowPane,当调整大小时,它非常适合让一个人在另一个下面流动,但我无法让第二个菜单可靠地对齐。我尝试了一个将侦听器放在父宽度上并计算要使用的hgap的技巧,但是第一次调用它时,菜单栏的大小为0,因此hgap对于实际菜单来说太大了。在我调整一次之后,这个技巧很有效。
更好的是一个可以自动流动的menuBar,这样我就不必将其分解以允许它环绕。但如果存在这种能力,我一直无法找到它。
答案 0 :(得分:1)
AFAIK MenuBar
不支持包装其Menu
可以有不同的方法来实现您想要的布局。其中一个在下面。
要将第二个管理flowPane对齐,请使用HBox.setHgrow
表示flowPane。要在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();
}