Con la programación orientada a objetos, puedes modelar cualquier cosa escribiendo el código una vez, para luego replicarlo tantas veces como necesites.
¿Esto que es?
Un panel con 4 botones verticales.
Pues puedes crear una clase que herede de JPanel (por tanto, será un JPanel).
con un layout que coloque elementos en vertical, por ejemplo, un BoxLayout configurado para el eje Y(vertical)
y que tenga 4 botones.
Incluso, si no quieres limitarte a solo 4 botones, puedes crear un arreglo de JButton e indicar mediante el constructor de la clase cuántos elementos ha de tener ese arreglo.
Opcionalmente añadimos color de fondo y unos bordes.
Bien, ¿qué es esto?
Un panel, que contiene los paneles de botones que hemos modelado en la clase anterior.
Este panel coloca esos paneles de botones, de forma horizontal, pegados a la izquierda y sin repartir las dimensiones para llenar todo el espacio disponible.
De nuevo, podemos crear otra clase que herede JPanel , a la cuál podamos añadirle "paneles de botones" y que los distribuya de esa manera.
Para distribuir en horizontal, podemos usar por ejemplo, un FlowLayout especificándole que ha de hacer que los elementos que le añadamos, floten hacia la izquierda.
Si no especificamos nada, "flotarían" desde el centro.
Y ya de paso, opcionalmente también especificamos algún color y bordes.
Es una clase tan sencilla como esta:
Por último, ¿qué es esto?
Un JFrame, con 15 "paneles de arrays de botones", cada uno con 4 botones.
Estos paneles se distribuyen en tres filas
La primera es un "panel de arrays" con 4 arrays de botones.
La segunda fila son "dos paneles de arrays", uno con 4 y otros con 3.
La tercera fila es igual que la primera.
Pues crearemos un JFrame, con un arreglo de 15 "arrays de botones" (la primera clase que hemos escrito)
Crearemos 4 "paneles con arrays", a cada uno le añadiremos 4 "arrays de botones", menos a uno que solo tendrá 3.
Con un BoxLayout vertical colocaremos los "paneles con arrays".
Los de la segunda fila, que son dos, irán dentro de un JPanel para agruparlos y que vayan juntos en la misma fila. Este JPanel le podemos poner un GridLayout, este layout asegurará que ambos paneles tengan la misma dimensión, a pesar de que uno tendrá 4 arrays de botones y el otro solo 3.
En fin, el código final al completo podría ser este:
Lo cuál nos da una interfaz con una distribución muy similar a lo que buscabas:
Ya luego hay otros aspectos que habría que tener en cuenta.
Por ejemplo, se supone que cada botón tendrá una acción (ActionListener).
¿Cómo se las asignaremos?
Pues la clase
PanelBotones, sus arreglos de JButton no son privados, así que se puede acceder a ellos para asignarles acciones, cambiar el texto que muestran etc...
Otra opción sería declarar por separado esos JButton, como atributo de JFrame, en un arreglo de 60 JButton (15 arrays de botones X 4 botones de cada uno = 60 botones)
Y modificar la clase
PanelBotones para que en lugar de crear ella su propio arreglo de botones, que reciba por constructor un arreglo con los botones que tiene que colocar.
Así ese arreglo de 60 botones, una vez declarados, creados, configurados y listos para ser usados.... se podrían "trocear" en pequeños arreglos de 3/4 botones y hacérselos llegar a la clase
PanelBotones por constructor para que los coloque.
Con la programación orientada a objetos, hay muchas posibilidades y formas de hacer las cosas, ya es escoger la que nos parezca más cómoda según cada caso.