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