Responsividade com Java Swing

Estou tentando criar a seguinte tela:

O tamanho do JPanel principal é sempre a resolução do atual monitor. Todavia, queria uma sugestão sobre como deixar o tamanho dos quadrados responsivo, também. Mas não faço ideia de como.

Código:

public ViewerController() {
    gerarTela();
}

private void gerarTela() {
    var jframe = geraJframe();
    var mainPanel = new JPanel(new FlowLayout());
    var factory = new MediaPlayerFactory();

    for (int i = 0; i < 16; i++) {
        var canvas = new Canvas();
        canvas.setBackground(Color.BLACK);

        var painelVideoTemp = new JPanel();
        painelVideoTemp.setPreferredSize(new Dimension(450, 255)); //TODO RESPONSIVIDADE
        painelVideoTemp.setBackground(Color.BLUE);
        painelVideoTemp.setLayout(new BorderLayout());
        painelVideoTemp.add(canvas, BorderLayout.CENTER);

        var player = factory.newEmbeddedMediaPlayer();
        player.setVideoSurface(factory.newVideoSurface(canvas));

        players.add(player);
        mainPanel.add(painelVideoTemp);
    }

    mainPanel.setBackground(Color.LIGHT_GRAY);
    jframe.add(mainPanel, BorderLayout.CENTER);
    jframe.addWindowListener(new WindowAdapter() {
        @Override
        public void windowClosing(WindowEvent e) {
            stop();
            super.windowClosing(e);
        }
    });
    jframe.setVisible(true);
}

private JFrame geraJframe() {
    Toolkit tk = Toolkit.getDefaultToolkit();
    Dimension d = tk.getScreenSize();
    JFrame jFrame = new JFrame();
    jFrame.setMinimumSize(new Dimension(d.width, d.height));
    jFrame.setLayout(new BorderLayout());
    jFrame.setIconImage(tk.getImage(getClass().getResource("/imgs/icon.png")));
    jFrame.setExtendedState(JFrame.MAXIMIZED_BOTH);
    return jFrame;
}

Alguma ideia?

A área onde estão os quadrados só vai ter os quadrados, ou vai ter outras coisas (botões, labels)?

A quantidade de quadrados (linhas e colunas) vai ser sempre a mesma (4x4) ? Se sim, talvez você possa tentar um GridLayout ou GridBagLayout, em vez do FlowLayout. Eles são um pouco mais fáceis de trabalhar para esse tipo de grade.

Abraço.

Opa @TerraSkilll. Valeu pela sugestão. Sim, serão sempre 4x4, totalizando 16 canvas. Não terá botões, mas pode ser que tenha uma label embaixo de cada. Vou dar uma pesquisada no GridLayout, mas ele consegue garantir o que preciso?

Com o GridLayout, o tamanho dos elementos é automaticamente responsivo, de acordo com o tamanho da janela. O fato da quantidade ser fixa no seu exemplo já facilita muito nesse caso. Um exemplo meio bruto:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class GridJanela extends JFrame{

	GridLayout layout = new GridLayout(4, 4, 5, 5);

	public GridJanela(){
		setLayout(layout);
		setPreferredSize(new Dimension(500, 500));
		setSize(getPreferredSize());

		for(int i=0; i < 4; i++){
			for(int j=0; j < 4; j++){
				createPanel(getContentPane());
			}
		}

		setExtendedState(JFrame.MAXIMIZED_BOTH);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}

	private void createPanel(Container pane){
		JPanel panel = new JPanel();
		panel.setBackground(new Color(100, 0, 200));
		pane.add(panel);
	}

	public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new GridJanela().setVisible(true);
            }
        });
    }
}

No createPanel, você pode criar instâncias de um JPanel customizado, com outro layout (ex: um BorderLayout). Assim, na parte de baixo (BorderLayout.SOUTH) você pode colocar um JLabel, e no resto do espaço outro JPanel com o que você quer exibir (BorderLayout.CENTER). Dá um trabalhinho, mas qualquer layout decente (em Java ou não) acaba tendo os mesmos problemas.

Abraço.