I had a look at the invisible ships problem and sadly found another bug in Apples java implementation (all versions)
drawImage(Image img, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1, int sx2, int sy2, Color bgcolor, ImageObserver observer)
If the source and destination areas are the same size, i.e. no scaling is required, then the library treats it as a special case and renders it much faster. Unfortunately the special case code ignores the ābgcolorā parameter and leaves the background colour unchanged.
To work around this problem either requires splitting the sprites up into separate images, allowing drawImage(img, x, y, color, null) to be used, which does work, or prefilling the background of each sprite with drawRect(x,y, width, height). The latter is a bit nasty, but might be possible.
/Edit: Nasty kludge incorporated to support OS X. Hopefully works on the Mac now.
Alan