0

一番上の行に 2 つのメニュー バー (アプリケーション メニューと管理メニュー) があり、その間に検索ボックスがあるアプリケーションがあります。最初のメニュー バーは左に配置され、その直後に検索ボックスが続きます。2 番目のメニューは右に配置されます。これにより、管理メニューを移動しなくても、アプリケーション メニューを追加する余地が残されます。

HBox を試しましたが、2 番目のメニューを正しく表示できません。

AnchorPane を使用して、アプリケーション メニューを左に、管理者メニューを右に固定してみました。サイズを変更するまで、これは正常に機能します。ディスプレイが小さすぎて両方のメニューを表示できない場合、文字が切り捨てられ始めます。2 番目のメニューを次の行に折り返す必要があります。

サイズ変更時に一方が他方の下に流れるようにするのに最適なFlowPaneを使用してみましたが、2番目のメニューを信頼できる右揃えにできません。親の幅にリスナーを配置し、使用する hgap を計算するトリックを試みましたが、これが初めて呼び出されたとき、メニュー バーのサイズが 0 であるため、実際のメニューに対して hgap が大きすぎます。一度サイズを変更すると、そのトリックはうまく機能します。

さらに良いのは、自動的に流れる menuBar で、ラップアラウンドを許可するために分割する必要がなかったということです。しかし、その機能が存在する場合、私はそれを見つけることができませんでした.

4

1 に答える 1

1

私の知る限り、そのs のMenuBarラッピングはサポートされていません。 必要なレイアウトを実現するには、さまざまな方法があります。そのうちの 1 つを以下に示します。 2 番目の admin flowPane を右に揃えるには、for flowPane を使用します。flowPane でメニュー バーを整列するには、以下を使用します。Menu

HBox.setHgrowflow.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 に答える