Mach' das
frame.setVisible(true);
immer ganz am Ende. Dann wird es IMMER falsch dargestellt.
( :lol: *kaputtlach* :roll: )
Mal im ernst: Die Frage, wo der Button liegt und wie groß er ist, wird vom LayoutManager entschieden. "Umgehen" kann man das, indem man ein "null-Layout" setzt:
frame.getContentPane().setLayout(null);
aber das sollte man nur in den ALLERSELTENSTEN Fällen machen. (Wenn man dann z.B. die Fenstergröße ändert, passen die Positionen und Größen ja nichtmehr). Stattdessen sollte man sich den passenden LayoutManager aussuchen, und den für die ConentPane des Frames setzen.
http://java.sun.com/docs/books/tutorial/uiswing/layout/using.html
Standardmäßig ist ein BorderLayout voreingestellt.
Ach ja: Das
frame.setVisible(true);
sollte übrigens WIRKLICH immer als letztes gemacht werden!