Yep, looks to me that setting the preferred size still won't work until the frame is packed.
You can however issue a setSize on a panel and lock it to that size prior to calling a pack.
Another thing that would work as well would be to generate all the components first, place them on the panel and frame, and then pack it. After the pack then you modify what you need before setting visible. I'm not sure what Java does with this, but I don't think it paints a thing until you call the visible? If that's the case, you would need no listeners, and you can simply add the scaled image before showing the frame. If you need resizing though, you'll still need to add a listener to the items on the panel or the panel itself.
header('HTTP/1.1 420 Enhance Your Calm');