Fare setSize sul frame non ti assicura in nessun modo che le dimensioni "interne" del frame siano quelle che hai stabilito, in teoria dovrebbero essere inclusi anche i "bordi" del frame (che fra l'altro variano tra i vari sistemi operativi), ma anche misurando tutto il frame che crea il tuo codice a me su Windows 10 esce un frame alto 390 pixel circa (bordo compreso).
E' questo il punto principale del discorso: non dovresti farlo.
Cioè l'approccio è sbagliato, non dovresti voler settare la dimensione del frame e fare in modo che i pannelli "ci stiano dentro", questo causerà sempre vari problemi.
Dovresti seguire l'ordine inverso: impostare le dimensioni dei componenti interni, e lasciare che la dimensione dei contenitori sia impostata direttamente dall'applicazione, che provvederà a renderli grandi il giusto per poter contenere ciò che è dentro.
Il JFrame, come molti altri componenti, ha un metodo chiamato pack() che serve appunto a "impacchettare" il frame, se lo richiami dopo aver aggiunto ogni componente il metodo provvederà a validare il frame e dimensionarlo correttamente.
Questo è l'approccio che viene tipicamente seguito.
Per quanto riguarda il pannello, anche qui potrebbe non servire volerne forzare la dimensione, anche se in molti casi ha senso.
In ogni caso se lo vuoi fare penso sia preferibile utilizzare il metodo setPreferredSize(Dimension d) rispetto al setSize(int,int).
Ti sconsiglio caldamente di farlo, questo tipo di approccio è largamente superato, i LayoutManager ci sono e conviene imparare ad usarli, meglio iniziare da subito.
Tra l'altro anche per le prime prove che farai ci sono layout manager davvero semplici da usare, e ti assicuro che se capisci come funzionano potrai continuare ad usarli per molto tempo e per applicazioni anche più complesse![]()