Re: Adding ExitListeners to Netbeans generated Desktop Application?
Rexx Magnus, 07.08.2008 11:41:
I want to avoid using the menu hooks and OS detection to catch the use
of the Apple menus, because this requires importing of apple packages,
Not necessarily. You can add a hook without needing the Apple libraries at compile time.
Of course if anything changes in the Apple interfaces this will stop working, but I don't think there is a way around that.
Here is the code.
I removed error handling and logging, but I guess you get the Idea.
I simply check for the OS at startup (before initializing any GUI!) and then call installApplicationHandler()
public class MacOSHelper
implements InvocationHandler
{
private Object proxy;
public MacOSHelper()
{
}
public void installApplicationHandler()
{
Class appClass = Class.forName("com.apple.eawt.Application");
Object application = appClass.newInstance();
if (application != null)
{
Class listener = Class.forName("com.apple.eawt.ApplicationListener");
this.proxy = Proxy.newProxyInstance(listener.getClassLoader(), new Class[] { listener },this);
Method add = appClass.getMethod("addApplicationListener", new Class[] { listener });
if (add != null)
{
// Register the proxy as the ApplicationListener. Calling events on the Listener
// will result in calling the invoke method from this class.
add.invoke(application, this.proxy);
}
// Now register for the Preferences... menu
Method enablePrefs = appClass.getMethod("setEnabledPreferencesMenu", boolean.class);
enablePrefs.invoke(application, Boolean.TRUE);
}
}
public Object invoke(Object prx, Method method, Object[] args)
throws Throwable
{
String methodName = method.getName();
if ("handleQuit".equals(methodName))
{
// According to the Apple docs, one should call ApplicationEvent.setHandled(false);
// in order to be able to cancel exiting.
// See http://developer.apple.com/samplecode/OSXAdapter/listing2.html
setHandled(args[0], false);
System.exit(0);
}
else if ("handleAbout".equals(methodName))
{
// Show about dialog
setHandled(args[0], true);
}
else if ("handlePreferences".equals(methodName))
{
// Show Options dialog
setHandled(args[0], true);
}
else
{
LogMgr.logInfo("MacOSHelper.invoke()", "Ignoring unknown event.");
}
return null;
}
private void setHandled(Object event, boolean flag)
{
Method setHandled = event.getClass().getMethod("setHandled", boolean.class);
setHandled.invoke(event, Boolean.valueOf(flag));
}
}