Tuning Java Swing apps for Mac OS X 37
tarkin writes "Sven Van Caekenberghe just finished a tutorial article, 'Tuning Java Swing applications for Mac OS X', that explains how to tune standard Java Swing applications to conform to the Mac OS X User Experience and make them virtually indistinguishable from native Mac OS X applications. Topics include handling basic Apple events, packaging applications, adding a custom icon, file dialogs, about boxes, preferences, customizing the menu bar, supporting Finder drag-and-drop, standard help, and basic multi-document support, as well as using MRJToolkit and MRJAppBuilder. The PDF of the article, as well as a Mac OS X disk image with a binary version of the two demo applications and the source code can downloaded from his home page."
Apple Tuning Java Swing (Score:3, Funny)
Not bad... (Score:4, Informative)
Perhaps the next thing we need is skinnable Swing?
Re:Not bad... (Score:4, Informative)
My method of java development (Score:5, Insightful)
SWT? (Score:2, Interesting)
Re:SWT? (Score:2)
Re:SWT? (Score:5, Informative)
This looks like the best introduction:
http://www.eclipse.org/articles/Article-SWT-Design -1/SWT-Design-1.html [eclipse.org]
Re:SWT? (Score:1)
Eclipse? Feh! (Score:3)
I have given up on the Eclipse IDE -- the checklists for downloading samples are all two pages long, their menus and dialogs are all non-standard, and I have not yet figured out what options to specify to actually run any of the samples I have built.
Is it just me or is Eclipse just impossible to figure out? I have used (for C++) everything from Code Warrior to Borland to VC++, but Eclipse has me completely stumped. I suppose I could figure it out if I devoted a couple weeks to it, but I just don't have that kind of time to evaluate something I am not sure is of any use.
As to the SWT, isn't that the kind of thing Microsoft got sued for?
As SWT is tightly coupled through JNI to the target system, you have to distribute a .DLL (some kind of extra software blob) with your SWT app for every possible target system. Yeah, yeah, AWT/Swing has to eventually call something native, but those customizations are part of the Java runtime you install for each target system, not some extra blob that you need to distribute.
Also, SWT is much more complete on Windows while the Linux version is "in progress" and the OS-X version is a distant dream. Now isn't this kind of write-once, run under Windows just the thing Microsoft got sued for?
Re:Eclipse? Feh! (Score:2, Interesting)
eclipse took me a small amount of time to get used to, but to me, its the best Java IDE on the market. Of course, the availability of refactoring is the bar to clear to even enter the competition, so that limits things a bit. JBuilder blows goats in comparison. My recommendation would be to create your own project in eclipse and start using it, rather than using sample apps.
To be fair, I haven't tried eclipse for Mac OS X, but all new builds of the 2.1 series are being created for Mac OS X as well, including the stable Milestone 1.
Is it the same as what Microsoft did? I don't think so. I'm pretty sure you had to use MS's JVM to run Microsoft "Java". SWT will work with any JVM, provided the appropriate native libraries are installed. I am a little disheartened by the limited number of alternate platforms available, but more keep coming. Give it time.
Re:Not bad... (Score:2, Funny)
I think you typo'd here. Surely you meant to say, "the last thing we need is skinnable Swing."
java ... skins ... (Score:2, Interesting)
Re:Java on OS X??? Got to be kidding... (Score:5, Interesting)
Yeah. Sure.
You don't know what you're talking about.
Applications can be slow. The OS is not slow.
Java on OSX is rather speedy, and compares favorably with the previous platform I've used it on, Linux.
Cocoa apps are totally speedy, as fast as C apps.
Carbon apps that are poorly made will be slow, and if they're really poor (like IE) they can slow the whole system down.
But your generalizations are just wrong.
He's right. (Score:3, Insightful)
That being said, I just want a compiler that can build native apps with one code base. Yes I know C++ can "theoretically" do this, but not if you're trying to make it a true native app. I want to say build file menu and the compiler knows on apple it's integrated and on a PC it's got it's own menu interface, on linux you can choose how you want it laid out (SDI versus MDI).
This is the killer app for developers and I personally would pay several thousand for a development environment that could do this. I'll return to my pipe dream shortly.
Re:He's right. (Score:5, Interesting)
I thought that is what you got with Java on the mac.
I've been doing mostly server side stuff so I can't say for sure, but it is my understanding that you write a Swing UI Java App on the Mac and on the Mac you get the Aqua look and feel. This is from conversations with an Apple developer who was the person who wrote it, but I may have misunderstood.
At the very least it should be one of the choices for looks that you get with swing (Remember windows, metalic, etc?)
So you write a swing app and on OS X it looks like OS X and on Windows it looks like Windows and on Linux it looks like Windows and on Solaris it looks like Swing.
You're right about apple optimizing their JVM etc. The reason 1.4 is delayed (so the rumors go) is that they are doing a complete rewrite. From what I saw with 1.3 they've done some great improvements on what Sun ships.
Wouldn't realbasic do what you want as well? One language-- though it has C support as well-- and deploy on at least Windows and Mac with the same UI.
Inherently when you make a multi-platform dynamically-chosen-look and feel, or consistent look and feel across all platforms, there WILL be compromises because the platforms are different.
So, I'm not sure what you're looking for-- if you think that someone can make one that dynamically picks the right UI without any compromises (java's slowness, or ui variations) then I think you're not quite understanding the problem correctly.
Personally, I have no desire to support the windows platform anymore, so I just do everything in Cocoa with Objective-C. And objective-c rocks. I thought Java was the paragon of perfect languages, but I have to admit I like objective-c better.
Re:He's right. (Score:1)
Well, you are partialy right. If you run a java app that uses swing and doesn't specify its L&F, you will get the Aqua L&F. Thats not to say its totaly Aqua though, because unless you use some MRJToolbox calls (don't remember which ones) the menu bar will still be part of the App's windows.
Atleast that is my experiance so far in doing cross platform java dev on OS X for my classes. What I would like is a java compiler that can do some pre-processing. That way I could put the MRJ calls in, with #ifdef's (or what ever) around them, and the rest of my team could still compile on windows and linux with out any problems.
Your right but that's not what I was asking for. (Score:2)
From one source if someone built a compiler that could understand the UI nuances between OSes I would spend loads. Not to mention could you imagine the apps that would be built?
Seriously if a company could use (lets call it NativeJava) NativeJava and build for Linux/Solaris/OS X/OS 9/Windows 9x/Windows 2000/XP with one source file that could be compiled via processor emulation for all platforms, there would be some great Mac/Linux applications because the barrier to entry for building Mac/Linux Apps would be almost zero (you'd want to buy those systems to test of course). Realbasic (as irritating as their marketing guy is) is the closest product to this. However it would need a lot more work to get there.
I just want to hit F5 and have my app built for several platforms and as a developer/business person, I would pay a shitload for this functionality. I currently build apps for all the previously mentioned platforms (except OS 9, I am late to the Mac scene).
Re:Your right but that's not what I was asking for (Score:1, Informative)
On the Mac it is ".app" for applications, but the convention is for file name extensions not to be shown in the GUI (you get the type in the GUI from an icon or from a complete description such as "Application").
Over time, Apple and Sun and others in the Java community will probably come up with ways to make Java apps appear even more native, especially on Mac OS X, since it is so Java-friendly. Also, once you dress up your application in Aqua, it looks really great and it is very, very easy to use. I added a Java app to my creative tools recently (for the first time) and all I had to do to use it was run it. It appears to be just one icon, but if you look inside the "package", there is a Mac icon file in there and a JAR file and a few XML files that tie it all together and provide meta information to the system.
Here is the app, for those that are interested: MuSing [geneffects.com]. I added pro drum sounds to it and it is really worthy of running next to Logic and Pro Tools and other great Mac audio software.
There is a great opportunity for Java developers on Mac OS X. You start with your JAR file, and an afternoon later, you have a Mac app. Hire an artist to make an icon for you, or solicit them from your users if you aren't an artist yourself ... you'll get three or four back in a few days and your app will really benefit from a nice icon. That's the user's handle on your app and they appreciate it when some kind of artistic statement is made there that is worthy of the algorithms and whatnot in your application.
Mac OS X is a great place for Java to shine in the mainstream. I'm looking forward to using more and more Java apps over time, and knowing that I'm doing so less and less.
Re:He's right. (Score:2, Interesting)
Re:He's right. (Score:1)
I want a 50 inch lcd monitor that can fold in the palm of my hand. It has to be blue, and also weigh less than a pound. There are paperclips in the secretaries desk, and I think a stapler, for supplies. You have until friday.
Guys, give these people time, you know just as well as anyone else that developing does take time. Hence the reason I can't run arachnophilia until apple comes out with the 1.4 version of jre, or anything else. Give it time.
As to this whole osx is slow. I've been running osx for about.. a month. I like it, and it is faster than any os I have run, and I am only on 256 megs of ram. The fact that I can run windows within the emulator, and still have a decent os to run such things as itunes and mozilla shows that the os is not slow, just apps themselves. Give people time, or otherwise, e-mail their bosses.
---
I have no sig
Reply to reply, from the Original Anonymous Coward (Score:1, Interesting)
You don't know what you're talking about.
Applications can be slow. The OS is not slow.
When I say the OS is slow I am, of course, referring to the general responsiveness of the UI. MacOS X is a speed demon in many things...but falls far short of Linux, Windows and MacOS Classic when it comes to UI responsiveness. When I use these other OSes I feel like I've just received an adrenaline injection after extended periods with OS X. This is a problem that needs to be fixed, either with some heavy low-level modifications to the GUI or, more probably,...with faster hardware.
Java on OSX is rather speedy, and compares favorably with the previous platform I've used it on, Linux.
That's not saying much...=). Java in general is sloooow...painfully so..and GUI apps for all platforms leave plenty to be desired. I haven't made a comprehensive comparison of Java GUI speed between platforms, but I know this: the responsiveness of Java apps in MacOS X is terrible. Not bad but terrible. On my 500Mhz G4, I find most, if not all Java apps bordering on unusable and avoid running them unless literally forced to. Much to my relief I discovered Acquisition recently, and can replace LimeWire with a Gnutella client that doesn't bog down my system.
Cocoa apps are totally speedy, as fast as C apps. Carbon apps that are poorly made will be slow, and if they're really poor (like IE) they can slow the whole system down.
Any app that is poorly programmed will be slow, regardless of whether it is programmed with the Cocoa or Carbon APIs. My point in the post you replied to is that EVEN these Cocoa and Carbon apps for OS X leave something to be desired.
But your generalizations are just wrong.
I don't think so. It's not as if I'm ignorantly bashing OS X here. I've made studied various aspects of OS X comprehensively and found considerable shortcomings in MacOS X in terms of GUI speed performance. I believe I'm addressing here genuine concerns mirrored by the OS X community as a whole. I want OS X to be the greatest UNIX ever and I think it has the potential to become so. But that doesn't mean I'll close my eyes to obvious problems and pretend that nothing is wrong.
Sveinbjorn Thordarson
http://www.raunvis.hi.is/~ssv
Best Tuning Advice (for real) (Score:4, Informative)
Swing apps are incapable of behaving like Mac apps. Thus using the Aqua theme for Swing apps is the absolute worst possible combination!
One of the key reasons Swing apps will NEVER behave like Mac apps is the Java file primitive. The misnomer File class should really be called FilePath. Since (100% Java) Swing apps use file paths as file primitives this implies that file paths are constant. Thus if you move/rename an open file (or host directory/non-root volume) the Swing app will become confused.
Re:Best Tuning Advice (for real) (Score:5, Interesting)
One reason for using the Aqua L&F, though, is that it is better optimized for OS X. Try running a complex application in Metal on OS X and again in Aqua. In my experiance the difference was quite aparent. You have a point though that the feel of java apps on OS X is still not quite right, but using Metal isn't any better (it just makes things more ugly).
Cocoa apps have the same file path problem. NSDocument based apps now use FSRef's as well as NSURL's so they don't, but if you write a Cocoa app that doesn't use NSDocument, its up to you to do the FSRef magic you need to track files based on their HFS+ id number.
Re:Best Tuning Advice (for real) (Score:3, Interesting)
Your assessment of Cocoa apps is correct except I would add that FSRefs also work on UFS volumes (and probably others) with the one caveat that you can't pass an FSRef to another process.
What Apple ought to do is what they did with the Toolbox more then a dacade ago which is to say deprecate functions (methods) which use file paths as arguments. Instead they ought to use something equivalent to an NSFSRef as a simple file primitive. They should also revise the Aqua HI Guidelines to clarify the behavior of "Save" and "Revert" to reflect the proper Mac behavior which can currently be had by using NSDocuments or FSRefs. They should also clarify that a file's path is variable, not constant.
Ironically Swing apps behave more like Cocoa apps in at least one aspect: the behavior of text views. NSLayoutManager doesn't behave correctly. For example selecting down on the right side will select the trailing linefeed of the last line selected which doesn't follow the Mac convention.
Unfortunately these problems are NOT going to be fixed unless more people send Apple feedback and bug reports.
Re:Best Tuning Advice (for real) (Score:1)
Last I heard that on non HFS(+) file systems, FSRefs revert to using path names rather than a file ID, since file ID's don't really exist on UFS (there are inodes, but still not quite the same). Assuming they are still implemented this way they don't provide the same features that they would on HFS(+), but atleast they don't break completely. (and if I am wrong on this, feel free to correct me.)
It's a behavior left over from NeXT. I prefer the old Mac way of selecting, but it would be great if they would atleast unify it to one or the other.
Re:Best Tuning Advice (for real) (Score:1)
FSRefs are an arbitrary 80 byte runtime reference for a file. For HFS+ it may per chance be comprised of a volume name and FileID but that's completely irrelevant because you're not supposed to store FSRefs and with Mac OS X not supposed to pass them to other processes. With UFS, FSRefs behave exactly the same as HFS+. I don't know the internal structure of the FSRef in Mac OS X w/UFS, but I really don't care either. It currently works.
You're probably thinking about Aliases in which case you would be correct. Aliases are anarbitrary description of how to find a file and on UFS volumes they break like symlinks, which again follows the specification. You can make Aliases on HFS+ volumes which also break like symlinks, just store the path and use null for the FileID and host FolderID.
As for selection I find the Mac selection behavior by FAR superior since 19 times out of 20 I don't want the trailing linefeed and when I do I can always add it after pasting (or dragging) by pressing return. The problem is even worse if you try drag+drop text. Even if you removed the insane delay, the linefeeds would get in the damned way.
Apple did change the selection behavior slightly in 10.1 so selecting to the right would be less annoying (it used to be like a bloody Windows app) but it still falls short, and selecting down wasn't imrpoved at all! They also reduced the delay for dragging text in 10.1 which didn't make any more or less sense than the delay in the first place. I swear the AppKit developers just do this to tease me, what other explanation is there?
What they ought to really do is implement the best of both worlds, and also add some standard cursor icons so you know whether you're hovering over a draggable item like selected text. This would eliminate a lot of the confusion former NeXT-heads had.
Anyway, file some bug reports |-)
One way to tell it is a java app (Score:1, Funny)
No point trying to dress it up