OSX 系统菜单栏在 JavaFX 中不起作用

Posted

技术标签:

【中文标题】OSX 系统菜单栏在 JavaFX 中不起作用【英文标题】:OSX System menubar not working in JavaFX 【发布时间】:2017-06-28 16:23:51 【问题描述】:

我试图使用https://github.com/codecentric/NSMenuFX 中的NSMenuFX 使JavaFX 应用程序使用MacOS 系统菜单栏,但由于此方法总是返回false,因此它不起作用。

Toolkit.getToolkit().getSystemMenu().isSupported()

方法来自包:com.sun.javafx.tk.Toolkit

深入代码,我发现Toolkit.getToolkit().getSystemMenu().isSupported() 调用了来自com.sun.glass.ui.Application 的方法,该方法也总是返回false。

protected boolean _supportsSystemMenu() 
    return false;


public final boolean supportsSystemMenu() 
    checkEventThread();
    return this._supportsSystemMenu();

这段代码有问题吗?如何使用系统菜单栏获取 JavaFX 应用程序。

注意:在 OSX 10.12.3 上使用的 JDK 是 8u121。

编辑 1 :按照 cmets 的建议,这里有一些代码。

import javafx.scene.control.MenuBar;

public class MyappMenuBar extends MenuBar 
// member variables -------------------------------------------------------------------------
    private final MyappPane mmyappPane;
    public MyappPane getMyappPane() return mMyappPane;
    private final MyappHelpMenu mHelpMenu;
    public MyappHelpMenu getHelpMenu() return mHelpMenu;

// constructors -----------------------------------------------------------------------------
    public myappMenuBar(MyappPane pMyappPane) 
        mMyappPane = pMyappPane;
        setUseSystemMenuBar(true);
        mHelpMenu = new MyappHelpMenu(pMyappPane);
        getMenus().add(mHelpMenu);
    

【问题讨论】:

有理由使用外部库吗?使用常规 JavaFX MenuBar 和调用 setUseSystemMenuBar(true) 不起作用吗? @James_D 实际上没有,“setUseSystemMenuBar(true)”没有效果。 它对我来说很好用。如果它不起作用,你可能做错了什么......发布一些代码。 我查看了您链接的库。它在所有地方都使用非公共 API 类,因此对于不同的 JDK 版本等,它不能是健壮的。这可能是它失败的原因(尽管也可能有其他原因)。我只会使用标准的 API 方式来实现这一点。 感谢@James_D,我添加了 MyAppMenuBar 类代码,我使用该类来构造 menuBar,然后实例化它并稍后使用。 【参考方案1】:

问题是由闪屏引起的 (java -splash:../img.png),因为它是 AWT 功能而不是 JavaFX 功能,似乎没有什么可以帮助结合 AWT 和 JavaFX 线程一起在一个线程中,-Djavafx.embed.singleThread=true 似乎不起作用。

目前我只是禁用了启动画面,并计划在应用程序中将其实现为 JavaFX 窗格。

【讨论】:

似乎系统菜单栏在 Javafx 版本:8.0.241-b07,运行时版本:1.8.0_251-b08 在 OSX 10.15.6 中确实不起作用。鼠标点击菜单栏无反应。

以上是关于OSX 系统菜单栏在 JavaFX 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

为啥禁用舞台可调整大小在 javafx 中不起作用?

bootstrap 4导航栏在rails 5应用程序中不起作用

物化图标在 JavaFX 浏览器中不起作用

搜索栏在 swift 3 中不起作用。无法将类型 (_) -> Bool 的值转换为预期的参数类型 NSPredicate

mmenu 菜单系统在 .Net 表单标签中不起作用

OSX移动光标事件在网络浏览器中不起作用