In my experience (sorry, but I don't feel like promising anything today

), if you don't use
setResizable
, then windows will appear at the correct size.
The gory details:
In X, the Inter-Client Communication Conventions Manual (ICCCM) specifies that 'normal' clients can tell the window manager their minimum and maximum size, as well as their desired size. When you call
setResizable(false)
, AWT adds the properties for minimum and maximum size, setting them both to be the same as the desired size. When you subsequently call
setSize()
, either directly or via something like
pack()
, AWT sets the desired size but doesn't touch the minimum and maximum. This means that there's a contradiction between the requested and permitted sizes, and different window managers deal differently with the conflict. Some disregard the constraints and others, including fvwm, disregard the invalid size.
If you call
setResizable(false)
after the window is showing, and don't subsequently resize it programmatically, then the constraints are in agreement with the requested size, and everything is okay.
I'm not sure if the problem of the connection frame appearing as 0x0 is related to the same problem, but it's possible.