Le dimensioni della label e del textfield non dovresti cambiarle a mano, in realtà di solito è sconsigliabile l'utilizzo di metodi come setSize (questo in particolare, anche per il frame utilizza il metodo pack () e lascia perdere il setSize) o i vari setPreferredSize (), setMaximumSize (), setMinimumSize ().
Talvolta sarai costretto a usarli (ad esempio se fai "custom painting" su un pannello, a volte sarai costretto a forzare la sua dimensione), ma il più delle volte non serve, e queste istruzioni sono delle forzature che spesso i layout manager ignorano.
Lo spazio viene diviso perfettamente in due perché quello è il comportamento del GridLayout : ogni cella occupa lo stesso spazio in verticale e in orizzontale, e lo spazio viene calcolato come lo spazio "massimo" richiesto. Quindi se una cella contiene un componente sciolto, questo sarà "tirato" per occupare lo spazio intero.
In questo caso quindi il GridLayout non è quello di cui hai bisogno. Ma ti sarà molto utile in futuro: a volte vuoi dividere lo spazio tra due o più pannelli in misura uguale, ma non vuoi allungare i componenti.
In quel caso il trucco è avere un contenitore interno alla cella (come un JPanel) e inscatolare il componente all'interno del pannello, in modo che l'allineamento funzioni ma il componente mantenga la propria dimensione.
Il disegno che hai postato è il tipico utilizzo di un BorderLayout, ma ci sono alcune differenze.
Nell'allegato in basso c'è un'immagine di come vengono posizionati i componenti in un BorderLayout (nota che non tutte le aree devono avere componenti all'interno, puoi tranquillamente avere solo nord centro e sud ad esempio).
Nel tuo caso avresti bisogno di tre aree ma se utilizzassi ad esempio il BorderLayout.CENTER per la Label 1, il BorderLayout.EAST per la Label 2 e il BorderLayout.SOUTH per il Textfield 1, il textfield occuperebbe anche l'area "al di sotto" della Label2.
Il BorderLayout.SOUTH infatti occupa l'intera lunghezza del proprio contenitore.
Se vuoi evitare questo comportamento hai molte strade: ad esempio nella parte SOUTH potresti inserire un pannello, a cui setti ad esempio un FlowLayout (con allineamento a sinistra). A questo pannello aggiungi il textfield, in modo che stia allineato a sinistra del pannello senza andare sotto a label2.
In questo modo però TextField1 non si allargherà all'allargarsi della finestra, ma sarà sempre nell'angolo in basso a sinistra.
La via corretta per replicare l'interfaccia del tuo disegno è però un'altra: innanzitutto assegni come layout del content pane un BorderLayout.
Nella parte centrale (ricorda che BorderLayout.CENTER occupa tutto lo spazio "in eccesso" del proprio contenitore) inserirai un pannello (chiamiamolo panel1 per ora) che conterrà in seguito Label1 e TextField1. Nella parte a destra inserirai Label2, che essendo in BorderLayout.EAST occuperà tutto lo spazio verticale dell'interfaccia, perché le parti BorderLayout.NORTH e BorderLayout.SOUTH del content pane non vengono utilizzate.
A questo punto panel1 (che sta in BorderLayout.CENTER del tuo content pane) sarà ulteriormente suddiviso in due parti.
E' conveniente settare anche a panel1 un BorderLayout, e aggiungere il TextField1 nella parte SOUTH, mentre la Label1 starà nella parte CENTER per occupare tutto lo spazio rimanente in verticale di panel1.
In allegato trovi anche un'immagine di come risulterebbe l'interfaccia con questa disposizione, che dovrebbe replicare la tua immagine.
Forse spiegato in questo modo il procedimento di composizione dei pannelli ti potrebbe sembrare un po' complesso, ma è davvero più facile a farsi che a dirsi, basta fare un po' di esperienza
Allegati: