Layout JavaFX菜单流
我有一个应用程序,上面一行有两个菜单栏(应用程序菜单和管理菜单),中间有一个搜索框。第一个菜单栏左对齐,搜索框紧跟其后,而第二个菜单右对齐。这样就为附加的应用程序菜单留出了空间,而无需移动管理菜单 我试过HBox,但第二份菜单没法调整好 我尝试使用AnchorPane,将应用程序菜单锚定到左侧,将管理菜单锚定到右侧。在您调整其大小之前,此功能可以正常工作。当显示器太小而无法同时显示两个菜单时,它将开始截断字母。我希望它将第二个菜单换行到下一行 我试着使用一个FlowPane,当调整大小时,它可以很好地让一个菜单在另一个菜单下流动,但是我无法正确地调整第二个菜单。我尝试了一个技巧,将侦听器放置在父宽度上,并计算要使用的hgap,但第一次调用它时,菜单栏的大小为0,因此hgap对于实际的菜单来说太大了。在我重新调整它的大小一次后,这个技巧效果很好Layout JavaFX菜单流,layout,javafx-2,Layout,Javafx 2,我有一个应用程序,上面一行有两个菜单栏(应用程序菜单和管理菜单),中间有一个搜索框。第一个菜单栏左对齐,搜索框紧跟其后,而第二个菜单右对齐。这样就为附加的应用程序菜单留出了空间,而无需移动管理菜单 我试过HBox,但第二份菜单没法调整好 我尝试使用AnchorPane,将应用程序菜单锚定到左侧,将管理菜单锚定到右侧。在您调整其大小之前,此功能可以正常工作。当显示器太小而无法同时显示两个菜单时,它将开始截断字母。我希望它将第二个菜单换行到下一行 我试着使用一个FlowPane,当调整大小时,它可以
更好的方法是一个菜单栏,它可以自动流动,这样我就不必把它拆开,让它环绕。但是如果该功能存在,我就无法找到它。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();
}