为了实现Java应用程序的Macify,为了捕捉about事件,我需要实现一个菜单吗?

为了实现Java应用程序的Macify,为了捕捉about事件,我需要实现一个菜单吗?,java,macos,about-box,Java,Macos,About Box,这是我能找到的唯一一个“macification”的例子,我想这一切都很好,很漂亮,除了菜单完全搞乱了我的布局。 我对Java非常、非常陌生,所以我严格遵循这些示例,但这个菜单真的必须取消。 有没有办法在没有菜单的情况下抓住“关于”的东西?毕竟,即使没有Mac操作系统,这种关于Mac操作系统的东西似乎也存在。标准程序等。 我没有Mac电脑来测试代码,所以试错是非常有限的 这是怎么做到的?有点像necro post,但我一直在使用它的代码。然而,它很复杂,并且使用反射来避免在非Mac系统上抛出错误

这是我能找到的唯一一个“macification”的例子,我想这一切都很好,很漂亮,除了菜单完全搞乱了我的布局。 我对Java非常、非常陌生,所以我严格遵循这些示例,但这个菜单真的必须取消。 有没有办法在没有菜单的情况下抓住“关于”的东西?毕竟,即使没有Mac操作系统,这种关于Mac操作系统的东西似乎也存在。标准程序等。 我没有Mac电脑来测试代码,所以试错是非常有限的


这是怎么做到的?

有点像necro post,但我一直在使用它的代码。然而,它很复杂,并且使用反射来避免在非Mac系统上抛出错误

在应用程序初始化过程中或作为静态代码块:

if (System.getProperty("os.name").contains("Mac")) {
    try {
        Object app = Class.forName("com.apple.eawt.Application")
            .getMethod("getApplication")
            .invoke(null);

        Object al = Proxy.newProxyInstance(
            Class.forName("com.apple.eawt.AboutHandler").getClassLoader(),
            new Class[]{Class.forName("com.apple.eawt.AboutHandler")},
            new AboutListener()
        );

        app.getClass()
            .getMethod("setAboutHandler", Class.forName("com.apple.eawt.AboutHandler"))
            .invoke(app, al);
    }
    catch (Exception e) {
        //fail quietly
    }
}
在最后一个大括号后的源文件底部

public class AboutListener implements InvocationHandler {

    public Object invoke(Object proxy, Method method, Object[] args) {
        //Show About Dialog
        return null;
    }
}

当用java发布一个完整的应用程序时,像这样的事情会带来一些小的好处。这应该主要是复制和粘贴功能,但您需要添加一两行来显示“关于”框。如果你真的需要测试,请使用WebStart、dropbox公共链接和附近的苹果商店。

不幸的是,“Macification”并没有多大意义。在UI方面,几乎没有一个操作系统比OSX更不一致(对于某些应用程序,他们最近在最新的OSX上设置了垂直操作窗口的按钮)。除非你在寻求苹果的某种认可,否则我真的不会太在意它,因为在OSX上没有“一种方式”,而是有几十种方式。更不用说,现在人们在OSX上使用的大多数应用程序都是网络应用程序,它们有自己的用户界面,苹果不会选择。然后买一个用过的Mac Mini来做测试:)而不是
System.getProperty(“os.name”).contains(“Mac”)
,你应该检查它是否包含
“os X”
,因为从10.8开始,他们从官方名称中删除了“Mac”,只留下了“os X”。您仍然需要检查“Mac”的唯一原因是您是否出于某种原因仍在使用Mac OS 9或更早版本。此外,还不清楚您为什么要使用反射进行所有这些操作。为什么不直接导入
com.apple.eawt.*
并直接调用类上的方法呢?这就是我所做的,它工作得很好。问题是Mac不可用于测试,反射的使用允许它在非Mac系统上编译。啊,我想你仍然可以导入类,只是如果你试图在非OS X系统上使用它们,什么都不会发生。谢谢你澄清这一点。