Como Inserir um JButton junto com a classe Graphics

Pessoal, sou iniciante com games e estou tentando desenvolver o banco imobiliário e estou utilizando a classe Graphics e ImageIcon (acho que não é a maneira mais eficiente de se fazer, mas no momento a única que sei). Enfim, eu queria adicionar um JButton no lado direito inferior do meu JFrame mas por causa do método paint ele não deixa o botão aparecer.
Se puderem me dar uma força serei e tiverem materiais para me ajudar a melhorar serei muito grato!

Aqui onde o JFrame é setado

public class Main {

public static void main(String[] args) throws FileNotFoundException {
    
    JFrame frame = new JFrame();
    GamePlay gp = new GamePlay();        
    
    frame.setTitle("Banco imobiliario");
    frame.setSize(1000,563);
    frame.setResizable(false);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setLocationRelativeTo(null);        
    frame.setVisible(true);
    frame.add(gp); 
      
}

}

classe do JPanel

public class GamePlay extends JPanel implements ActionListener {

ArrayList<CasaTabuleiro> casas = new ArrayList<>(); 
IniciaCasaTabuleiro initCasaTabuleiro;
Tabuleiro tabuleiro = new Tabuleiro();
Jogador jogador = new Jogador();
Random random = new Random();
private int posSorteada;
boolean fimTurno = true;


public GamePlay() throws FileNotFoundException {
          
   setFocusable(true); 
   setDoubleBuffered(true);                    
   setFocusTraversalKeysEnabled(false);
   this.setLayout(null);
   setBotoes();
  
   this.initCasaTabuleiro = new IniciaCasaTabuleiro();
   casas = initCasaTabuleiro.getCasa();
         
   Timer timer = new Timer(5, this);
   timer.start();
   
}

public void setBotoes(){  //   aqui onde supostamente era para ser setado o botão    
    JButton rolarDado = new JButton("Rolar dado");        
    rolarDado.setBounds(new Rectangle(900, 500, 95, 30));
    this.add(rolarDado);
     
}      

public void casaInformacao(){        
    casas.get(posSorteada).casaInfo(jogador);        
}

public void calculaI(int dado1, int dado2){
    
    posSorteada += dado1 + dado2;
    
    if(posSorteada > 31)
        posSorteada -= 32;            
} 

public void rolarDado(){
    
    int dado1 = random.nextInt(6) + 1;
    int dado2 = random.nextInt(6) + 1;
    
    JOptionPane.showMessageDialog(null, "Dado 1: "+ dado1 + "\n"
                                       +"Dado 2: "+ dado2);
    calculaI(dado1, dado2);   
}


@Override
public void paint(Graphics g) {
   
   tabuleiro.getTabuleiro().paintIcon(this, g, 0, -9);
    
    jogador.getJogador().paintIcon(this, g, jogador.getX(), jogador.getY());        
     
            
    if((jogador.getX() == casas.get(posSorteada).getX()) && (jogador.getY() == casas.get(posSorteada).getY()))
       fimTurno = true;
    else 
        jogador.mover();
    
    g.dispose();
} 

@Override
public void actionPerformed(ActionEvent ae) {
        
    if(fimTurno){  
       casaInformacao();
       rolarDado();
       fimTurno = false;
    } 
    
    repaint();               
    
}



public void setPosSorteada(int posSorteada) {
    this.posSorteada = posSorteada;
}

public void setFimTurno(boolean fimTurno) {
    this.fimTurno = fimTurno;
}

}