[RESOLVIDO PARCIALMENTE] Dezenas de botões em um JPanel com rolagem

Pessoal, estou criando uma interface bem simples, um gestor de mesas de um restaurante onde tenho um JPanel dentro de um JScrollPane e o meu método “carregar” adiciona vários botões dentro desse jpanel, um botões para cada mesa.
Até aí, ok. O problema é que dos vários Layouts do Java que eu testei, nenhum ficou organizado da maneira que eu queria. Ou os botões ficam linha crescendo somente para o lado direito, deixando a rolagem lateral, ou eles ficam somente para baixo, com uma única linha.

Eu queria que o botões fossem indo para a direito até o final do JPanel e depois começasse de novo na linha de baixo, como se fosse um texto.

Não sei se estão conseguindo entender.

O flowLayout por exemplo, ou adiciona somente um ao lado do outro, ou somente um abaixo do outro.
Já tentei configurar meu JPanel para largura máxima de 1000px. Não adiantou, continuou adicionando infinitamente somente para os lados.

Alguém conhece uma forma de organizar os botões da forma que eu disse?

Gostaria que os botões ficassem mais ou menos como os dessa foto.
com

Uma forma que sei que daria certo seria acrescentar todos os botões na unha, no Netbeans e deixar o JPanel com tamanho fixo, mas como o número de mesas vai variar e os botões seriam adicionados através do método “carregar”, dessa forma não funciona.

Alguém conhece uma possível solução?

PS: Utilizando o flowLayout até que ele consegue colocar organizado da forma que eu quero, mas a barra de rolagem vertical não aparece… :confused:

Pessoal, consegui resolver o problema utilizando uma gambiarra, segue o “tutorial”.

No Netbeans, adicionei um JScrollPane à minha janela. Depois adicionei um JPanel dentro do JScrollPane.
Adicionei ao JPanel um FlowLayout marcado para centralizar os componentes.
Após o método de inserir os botões no JPanel, eu chamo um método que altera o PreferredSize do JPanel.

    int a = Integer.valueOf(String.valueOf(((jScrollPane2.getWidth()-18)/180)).split(",")[0]);
    int b = clist.size() / a;
    jPanel3.setPreferredSize(new Dimension(1030, b * 370));

A variável “a” vai pegar a largura do JScrollPane - 18 (que é a largura da barra do rolagem) e dividir pela largura do meu “botão” (que na verdade é um outro JPanel servindo de botão). O valor dessa divisão será retornado como double, porém se eu passar diretamente o double -> int, o Java vai sempre arredondar para cima, ou seja, se for 5,657 o Java arredonda para 6, ou seja, um número a mais do que realmente caberia. Por isso eu transformei o double em String e depois cortei a String onde ficaria a vírgula. Assim eu deixo as casas decimais de lado e pego somente o inteiro.
Feito isso eu transformei a String em inteiro e guardei na variável “a”.

A variável “b” pega o tamanho do meu array de botões e divide pelo valor que acabamos de encontrar em “a”. Ou seja, ele divide o array pelo número de “colunas” que cabem na janela. Dessa forma, agora “b” vale o nosso número de linhas.

E na última linha, finalmente, eu seto um novo PrefferedSize para o JPanel, colocando a largura padrão de 1030px e na altura eu multiplico o nosso número de “linhas” pela altura exata dos “botões”.

Agora para que fique tudo certo não importa quantas vezes a janela do nosso programa seja redimensionada, no JFrame eu adicionei um evento sempre que a janela é redimensionada, e esse evento roda exatamente as 3 linhas acima.

private void formComponentResized(java.awt.event.ComponentEvent evt) {                                      
    // TODO add your handling code here:
    int a = Integer.valueOf(String.valueOf(((jScrollPane2.getWidth()-18)/180)).split(",")[0]);
    int b = clist.size() / a;
    jPanel3.setPreferredSize(new Dimension(1030, b * 370));
}

Detalhe, no flowLayout, deixei o Horizontal Gab e o Vertical Gab como 0. Para facilitar o cálculo.

Se alguém souber de uma maneira mais fácil de fazer isso, por favor me diga.

Segue algumas fotos.

Obrigado pela atenção de todos e até a próxima.