I've spent some time figuring this out, hopefully will save time of people reading this.
PopupFactory creates instances of Popup that one can show/hide in their Swing application. Quick and easy, the Popup javadoc suggests it can cache the popups etc. Great! And it actually worked pretty well on my MacOSX. However when I tried the same piece of code on Linux, it didn't repaint. I showed the popup, but never repainted the content, was more a picture or screenshow than a live component. Well, that was quite troubling because the popup component consisted of multiple progress bars. (As part of my daily work at Netbeans, I'm currently working on the Progress Indication component)
After endless hours and hints from coworkers, I figured that the problem was cause by a visible glasspane which was painting the wait cursor. Funny enough the visibility of the wait cursor correlates with the visibility of the progress bar in my case. Ensuring the glasspane stays invisible is hard to achieve. And it did work on Mac. The reason for that is that Apple's JDK enforces heavyweight popup. Oh, I didn't tell you that yet.
There are internally 3 kinds of popups, lightweight, mediumweight and heavyweight. On Linux I was consistently getting mediumweight popup, while on Mac the heavy version.
So how to force a heavyweight popup? The answer is non-obvious, I figured by looking at the code. In PopupFactory's createPopup() method don't specify the owner parameter. Passing null will magically create a heavyweight popup and everything starts working.
Hope that helps.
