Criar botões dinamicos e inserir em abas dinamicamente

Boa tarde pessoal, precisava de uma ajuda para criar uma tela com Abas e botões sendo criados automaticamente e se ajustando.
Por exemplo, tenho uma lista com os nomes dos projetos e um map de projetos e comandos. a Ideia seria criar uma tela assim:

meu código está assim, estou tendo dificuldade (na vdd nao sei como) fazer os botões serem adicionados nos desktop panel e suas respectivas abas… Alguem poderia me dar uma ajuda ou algum exemplo de como fazer, sei q vou fazer um if no for para ver as abas e tal , mas nao sei como add os botões.

código java:
package Screens;

import java.awt.GridLayout;
import java.util.HashMap;
import java.util.Map;
import javax.swing.JButton;
import javax.swing.JDesktopPane;
import javax.swing.JInternalFrame;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.event.InternalFrameEvent;
import javax.swing.event.InternalFrameListener;

public class ScreenCommands2 extends JInternalFrame implements InternalFrameListener {

public ScreenCommands2()  {
    super("", true, true, false, true);
    setSize(950, 600);
    setVisible(true);
   
    String[] arrayProject = {"PROJETO 1", "PROJETO 2", "PROJETO 3", "PROJETO 4"};
    Map<String, String> mapProjectxButton = new HashMap<>();
    
    JTabbedPane tab = new JTabbedPane(); 
    mapProjectxButton.put("PROJETO 1","BUTTON 1");
    mapProjectxButton.put("PROJETO 1","BUTTON 2");
    mapProjectxButton.put("PROJETO 1","BUTTON 3");
    mapProjectxButton.put("PROJETO 1","BUTTON 4");
    mapProjectxButton.put("PROJETO 1","BUTTON 5");
    mapProjectxButton.put("PROJETO 1","BUTTON 6");
    mapProjectxButton.put("PROJETO 1","BUTTON 7");
    mapProjectxButton.put("PROJETO 1","BUTTON 8");
    mapProjectxButton.put("PROJETO 2","BUTTON 2.1");
    mapProjectxButton.put("PROJETO 2","BUTTON 2.2");
    mapProjectxButton.put("PROJETO 2","BUTTON 2.3");
    mapProjectxButton.put("PROJETO 2","BUTTON 2.4");
    mapProjectxButton.put("PROJETO 2","BUTTON 2.5");
    mapProjectxButton.put("PROJETO 2","BUTTON 2.6");
    mapProjectxButton.put("PROJETO 2","BUTTON 2.7");
    mapProjectxButton.put("PROJETO 2","BUTTON 2.8");
    //verifico quantas abas devo criar
    for (int x = 0; x < arrayProject.length; x++) { 
        JDesktopPane desk = new JDesktopPane();            
        tab.addTab(arrayProject[x], desk);
        add(tab);           
    }
    //vejo quantos botoes preciso criar e add nas abas 
    for(int x = 0; x < mapProjectxButton.size(); x++){
        JPanel grid = new JPanel();
        grid.setLayout(new GridLayout(4, 4, 4, 4));
        JButton b = new JButton(mapProjectxButton.get(x));
    }
}

@Override
public void internalFrameOpened(InternalFrameEvent e) {
    throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}

@Override
public void internalFrameClosing(InternalFrameEvent e) {
    throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}

@Override
public void internalFrameClosed(InternalFrameEvent e) {
    throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}

@Override
public void internalFrameIconified(InternalFrameEvent e) {
    throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}

@Override
public void internalFrameDeiconified(InternalFrameEvent e) {
    throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}

@Override
public void internalFrameActivated(InternalFrameEvent e) {
    throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}

@Override
public void internalFrameDeactivated(InternalFrameEvent e) {
    throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}

}