I can't find any information on how to set the menubar icon for dark mode on OS X (introduced in OS X 10.10 Yosemite) in Java. I've seen this post http://mail.openjdk.java.net/pipermail/macosx-port-dev/2014-October/006740.html but without any answer. I know this has been discussed here How to detect dark mode in Yosemite to change the status bar menu icon for Objective-C, but not sure if this can be done similarly in Java.
Is there some way to achieve this?
I’ve had the same issue, solving it by invoking the defaults read
command and analyzing the exit code:
/**
* @return true if <code>defaults read -g AppleInterfaceStyle</code> has an exit status of <code>0</code> (i.e. _not_ returning "key not found").
*/
private boolean isMacMenuBarDarkMode() {
try {
// check for exit status only. Once there are more modes than "dark" and "default", we might need to analyze string contents..
final Process proc = Runtime.getRuntime().exec(new String[] {"defaults", "read", "-g", "AppleInterfaceStyle"});
proc.waitFor(100, TimeUnit.MILLISECONDS);
return proc.exitValue() == 0;
} catch (IOException | InterruptedException | IllegalThreadStateException ex) {
// IllegalThreadStateException thrown by proc.exitValue(), if process didn't terminate
LOG.warn("Could not determine, whether 'dark mode' is being used. Falling back to default (light) mode.");
return false;
}
}
Now you can load different images and use them in a java.awt.TrayIcon:
// java.awt.* controls are well suited for displaying menu bar icons on OS X
final Image image;
if (isMacMenuBarDarkMode()) {
image = Toolkit.getDefaultToolkit().getImage(getClass().getResource("/tray_icon_darkmode.png"));
} else {
image = Toolkit.getDefaultToolkit().getImage(getClass().getResource("/tray_icon_default.png"));
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With