Borderpane(顶部)窗格上的 JavaFX MenuBar 闪烁

JavaFX MenuBar on Pane on Borderpane (top) flickers

我正在 Java 中编写程序,我正在使用 JavaFX 作为 GUI, 使用 MVC 方式。

我说的视图结构如下:

这个结构的原因是因为我想保持我的代码干净和清晰。

在 TopPane 中,我只需要一个 menuBar。

我添加如下:

public class TopPane extends Pane {
    private MenuBar menuBar;

    public TopPane() {
        initNodes();
        layoutNodes();
    }

   private void initNodes() {
        Menu[] menus = new Menu[3];
        menus[0] = new Menu("File");
        menus[1] = new Menu("Options");
        menus[2] = new Menu("Help");

        MenuItem[] menuItemsFile = new MenuItem[4];
        menuItemsFile[0] = new MenuItem("New game");
        menuItemsFile[1] = new MenuItem("Save game");
        menuItemsFile[2] = new MenuItem("Load game");
        menuItemsFile[3] = new MenuItem("Exit");
        menus[0].getItems().addAll(menuItemsFile);

        MenuItem options = new MenuItem("Options");
        menus[1].getItems().add(options);

        MenuItem help = new MenuItem("Help");
        menus[2].getItems().add(help);

        menuBar = new MenuBar();
        menuBar.getMenus().addAll(menus);
    }

    private void layoutNodes() {
        menuBar.setMinWidth(Double.MAX_VALUE);
        menuBar.useSystemMenuBarProperty().set(true);
        getChildren().add(menuBar);
    }

    public MenuBar getMenuBar() {
        return menuBar;
    }
}

在 gameview 中,我执行以下操作:

public class GameView extends BorderPane {
    private TopPane topPane;
    private LeftPane leftPane;
    private PlayerView playerView; //centerpane
    private RightPane rightPane;

    public GameView() {
        initNodes();
        layoutNodes();
    }

    private void initNodes() {
        topPane = new TopPane();
        leftPane = new LeftPane();
        playerView = new PlayerView();
        rightPane = new RightPane();
    }

    private void layoutNodes() {
        this.setStyle("-fx-background-color:  #2a2a2a");

        this.setTop(topPane);

        Rectangle2D screenBounds = Screen.getPrimary().getVisualBounds();
        double screenHeight = screenBounds.getHeight();
        int topMargin = 25;
        if (screenHeight >= 1050) {
            topMargin = 150;
        }
        System.out.println(screenHeight);

        setMargin(leftPane, new Insets(topMargin, 0, 0, 50));
        this.setLeft(leftPane);

        setMargin(playerView, new Insets(0, 0, 0, 25));
        this.setCenter(playerView);

        this.setRight(rightPane);
    }
}

它成功显示了菜单栏,但问题是当我单击其中一个菜单时,菜单项会闪烁并立即消失。我认为这是因为我用 Pane 扩展了 topPane。但如果没有它显然无法工作,如果我从 menuBar 扩展(并删除变量 Menubar),我的 rightPane 和 PlayerView 将不会添加到我的 GameView 中,因为一些神秘的黑暗原因我无法弄清楚(还): )

有人能帮帮我吗? 提前致谢!

感谢 DVarga :

  • 删除 menuBar.setMinWidth(Double.MAX_VALUE);
  • 扩展 StackPane 而不是 Pane

这非常有效!