1

javafx.scene.control.MenuBar を AnchorPane に追加したいと思います。メニュー エントリの数は柔軟です。ユーザーは、MenuBar に 1 つ以上のエントリを追加できます。MenuBar でいくつかのメニュー エントリのみを使用する場合は、十分な水平方向の場所があります。

MenuBar menuBar = new MenuBar();
Menu menuFile = new Menu("File");
Menu menuEdit = new Menu("Edit");
Menu menuView = new Menu("View");
menuBar.getMenus().addAll(menuFile, menuEdit, menuView);

ただし、エントリー数が多く、項目が長い場合は、場所が足りません。これは通常のケースではありませんが、一部のユーザーはメニュー項目を追加したいと考えています。メニュー項目の最大数は 10 エントリに制限されます。

MenuBar menuBar = new MenuBar();
Menu menu1 = new Menu("Long first menu");
Menu menu2 = new Menu("My second long entry");
Menu menu3 = new Menu("another long entry");
Menu menu4 = new Menu("Long menu 4");
Menu menu5 = new Menu("My fifth long entry");
Menu menu6 = new Menu("another long long entry");

menuBar.getMenus().addAll(menu1, menu2, menu3, menu4, menu5, menu6);

マイ ダイアログはサイズ変更できません。すべてのメニューは、MenuBar で 1 行に配置する必要があります。これは GUI 設計上の決定です。

スクロール可能なメニューバーを使用したソリューションが必要です。この解決策が絶対に不可能な場合、次の解決策は、すべてのメニューの表示文字数を減らすことです。例: |長いモミ...|私の 2 番目の...|別の...| ...しかし、私は最初の解決策を好みます。

4

1 に答える 1

1

すべてのメニューの表示文字数を減らします。例: |長いモミ...|私の 2 番目の...|別の...| ...

これは、サイズ変更可能なペイン内に配置された MenuBar のデフォルトの動作です。

これは、長いメニューの例を使用したサンプル コードです。

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.*;
import javafx.stage.Stage;

public class ElidedMenu extends Application {
    @Override public void start(Stage stage) {
        MenuBar menuBar = new MenuBar();
        Menu menu1 = new Menu("Long first menu");
        Menu menu2 = new Menu("My second long entry");
        Menu menu3 = new Menu("another long entry");
        Menu menu4 = new Menu("Long menu 4");
        Menu menu5 = new Menu("My fifth long entry");
        Menu menu6 = new Menu("another long long entry");

        menuBar.getMenus().addAll(menu1, menu2, menu3, menu4, menu5, menu6);      

        StackPane stack = new StackPane();
        stack.getChildren().add(new Label("Hello World!"));

        VBox layout = new VBox();
        layout.getChildren().addAll(menuBar, stack);
        VBox.setVgrow(stack, Priority.ALWAYS);

        stage.setScene(new Scene(layout, 500, 250));
        stage.setResizable(false);
        stage.show();
    }

    public static void main(String[] args) { launch(args); }
}

サンプル コードの出力は次のとおりです。

省略されたメニュー


スクロール可能な MenuBar を備えたソリューション

MenuBar を ScrollPane でラップしてスクロール可能にします。

これは、長いメニューの例を使用したサンプル コードです。

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.*;
import javafx.stage.Stage;

public class ScrollingMenu extends Application {
    @Override public void start(Stage stage) {
        MenuBar menuBar = new MenuBar();
        Menu menu1 = new Menu("Long first menu");
        Menu menu2 = new Menu("My second long entry");
        Menu menu3 = new Menu("another long entry");
        Menu menu4 = new Menu("Long menu 4");
        Menu menu5 = new Menu("My fifth long entry");
        Menu menu6 = new Menu("another long long entry");

        menuBar.getMenus().addAll(menu1, menu2, menu3, menu4, menu5, menu6);      
        ScrollPane scrollingMenu = new ScrollPane();
        scrollingMenu.setContent(menuBar);

        StackPane stack = new StackPane();
        stack.getChildren().add(new Label("Hello World!"));

        VBox layout = new VBox();
        layout.getChildren().addAll(scrollingMenu, stack);
        VBox.setVgrow(stack, Priority.ALWAYS);

        stage.setScene(new Scene(layout, 500, 250));
        stage.setResizable(false);
        stage.show();

        scrollingMenu.setPrefSize(stage.getScene().getWidth(), menuBar.getHeight());
    }

    public static void main(String[] args) { launch(args); }
}

サンプル コードの出力は次のとおりです。

スクロールメニュー

于 2013-01-28T07:38:46.980 に答える