是否可以滚动JavaFX MenuBar

时间:2013-01-27 21:39:55

标签: javafx menubar scrollable

我想将一个javafx.scene.control.MenuBar添加到AnchorPane中。 菜单条目的数量是灵活的。用户可以在MenuBar中添加一个或多个条目。 如果我只在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);

但是如果有多个条目和一些长项目,那就没有足够的地方了。 这不是正常情况,但有些用户想添加更多菜单项。菜单项的最大数量将限制为十个条目。

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中的一行中。 这是一个GUI设计决策。

我想要一个带有可滚动MenuBar的解决方案。 如果绝对不可能使用此解决方案,则下一个解决方案可能是减少所有菜单的显示字符数。 例如:|长冷杉...... |我的第二个...... |另一个...... | ... 但我更喜欢第一种解决方案。

1 个答案:

答案 0 :(得分:1)

  

减少所有菜单显示的字符数。例如:|长冷杉...... |我的第二个...... |另一个...... | ......

这是放置在可调整大小的窗格内的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); }
}

示例代码的输出是:

elidedmenu


  

具有可滚动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); }
}

示例代码的输出是:

scrollingmenu