无法使用系统菜单栏 Javafx

Posted

技术标签:

【中文标题】无法使用系统菜单栏 Javafx【英文标题】:Can't Use System Menubar Javafx 【发布时间】:2017-11-25 06:44:04 【问题描述】:

我想将 JavaFX 菜单栏添加到舞台,但让它使用 Mac 的系统菜单栏。

我的问题是使用:

menuBar.useSystemMenuBarProperty().set(true);

不起作用。我认为问题在于我的主要方法不是 JavaFX 应用程序的一部分。我的主要方法是这样的:

public class SURPG_Launcher 

public static com.apple.eawt.Application macApp;

public static void main(String[] args) 
    if(Toolbox.isMac()) 
        initMac(args);
     else 
        Application.launch(SURPG_Main.class, args);
    


private static void initMac(String[] args) 
    System.out.println("MacOS System detected!");
    macApp = com.apple.eawt.Application.getApplication();
    macApp.setPreferencesHandler(new PreferencesHandler()
    @Override
    public void handlePreferences(PreferencesEvent arg0) 
        Platform.runLater(() -> 
            Stage prefs = new Stage();
            prefs.setMinHeight(200);
            prefs.setMinWidth(200);
            prefs.show();
        );
    
);

Application.launch(SURPG_Mac.class, args);



SURPG_Mac.class 和 SURPG_Main.class 是扩展 JavaFX 应用程序的类。

我有另一个设置 GUI 的类,一个带有 BorderPane 的舞台。我有另一个具有公共静态方法的类,可以调用它来设置菜单栏,如下所示:

public class MenuControl 

public static MenuBar menuBar;
public static Menu menuFile;
public static Menu menuGame;
public static Menu menuTools;
public static MenuItem save;

public static void initMenusMac() 
    menuBar = new MenuBar();
    Platform.runLater(() -> 
        menuBar.useSystemMenuBarProperty().set(true);
    );
    menuFile = new Menu("File");
    menuGame = new Menu("Game");
    menuTools = new Menu("Tools");
    save = new MenuItem("Save");
    menuFile.getItems().add(save);
    menuBar.getMenus().addAll(menuFile, menuGame, menuTools);
    GUI_Main.totalLay.setTop(menuBar);


public static void initMenus() 
    menuBar = new MenuBar();
    menuFile = new Menu("File");
    menuGame = new Menu("Game");
    menuTools = new Menu("Tools");
    save = new MenuItem("Save");
    menuFile.getItems().add(save);
    menuBar.getMenus().addAll(menuFile, menuGame, menuTools);
    GUI_Main.totalLay.setTop(menuBar);


我的最后一点是,由于与 Mac 集成存在不同的兼容性问题,我无法更改它,因此 main 方法位于 SURPG_Mac 或 SURPG_Main 中。

谁能帮我解决这个问题?

非常感谢您!

【问题讨论】:

【参考方案1】:

看看这个probject:https://github.com/codecentric/NSMenuFX它让你有一个更像mac的菜单栏。但是您可能还需要清理一些奇怪的项目设置,然后才能使用它。

【讨论】:

对不起,NSMenuFX 是问题。目标是不使用甲骨文和我自己的库。 另外,我奇怪的项目设置是什么意思?我需要清理什么?我真的很想知道。 1.如今,如果不使用外部库,就不可能进行认真的软件开发,而且我只是认为让生活变得比必要的更加困难没有任何价值。 2. 奇怪的项目设置我的意思是你摆弄 com.apple.eawt.Application 类。这可能会导致各种问题,并且 com.apple.eawt 类在 Java 9 中已被废弃。 好的,我明白你的意思了。我 100% 同意第一点,这只是作为我的高级项目,这就是我的目标。不使用任何库。我可能需要调整它...第二点,我希望能够调整 Mac 应用程序的首选项菜单/关于菜单和内容... NSMenuFX 允许我这样做吗? 是的,这就是这个小图书馆的目的。

以上是关于无法使用系统菜单栏 Javafx的主要内容,如果未能解决你的问题,请参考以下文章

JavaFX。为标题栏和操作系统任务栏设置不同的图标

JavaFX:整个框架的菜单栏宽度

是否可以滚动 JavaFX 菜单栏

在 JavaFX 中制作垂直菜单栏

JavaFx 将 Window-Control-Buttons 添加到菜单栏(类似 IntelliJ)

win10如何重装原系统以及重装系统后无法使用菜单栏设置等的解决方案