Java - joptionpane e método de laço

Pessoal, meu programinha tem um método que lista todos os projetos…
A pessoa pode pedir pra listar por exemplo, um projeto, adicionar um novo projeto, e dessa vez listar todos os projetos.
O problema é que a cada novo projeto inserido, quando ela pede pra listar todos os projetos é uma nova janela do JOptionPane, por exemplo, tem um projeto no Arraylist, se ela pede para listar, aparece uma janela do JOptionPane listando esse projeto, agora, se ela inserir mais 3 projetos, aparece 4 janelas do JOptionPane listando todos esses projetos…
poderiam me ajudar pleeease
segue o código:

import java.util.ArrayList;
import javax.swing.JOptionPane;
import java.util.Iterator;

public class Agencia{
   String dadosProjeto = "";
   private ArrayList <Projeto> projetos;
   
   public Agencia(){
      projetos = new ArrayList<>();
   }
   
   public void inserirProjeto(){
      
      String resposta = " ";
      String titulo = JOptionPane.showInputDialog("Título do projeto: ");
      double orcamento = Double.parseDouble(JOptionPane.showInputDialog("Orçamento do projeto: "));
      String duracao = JOptionPane.showInputDialog("Duração do projeto(meses): ");
      String instituicao = JOptionPane.showInputDialog("Insituição: ");
      String areaPesq = JOptionPane.showInputDialog("Área relacionada a pesquisa: ");
      int codProjeto = Integer.parseInt(JOptionPane.showInputDialog("Código do projeto: "));
      Projeto novoProjeto = new Projeto(titulo, orcamento, duracao, instituicao, areaPesq, codProjeto, resposta);
      projetos.add(novoProjeto);
      
      dadosProjeto += "********************************\nTítulo: " + titulo + "\nOrcamento: " + orcamento + "\nDuracao (meses): " + duracao + "\nInstituicao: " + instituicao + "\nÁrea de pesquisa: " + areaPesq + "\nCódigo do Projeto: " + codProjeto + "\nResposta: " + "\n\n********************************\n";
      
   }
   
   public void listarProjetos(){
      for(int i = 0; i < projetos.size(); i++){
         
      
      JOptionPane.showMessageDialog(null, dadosProjeto);    
      }
   }
   
   
   
   public void buscarProjeto(){
      int buscaCod = Integer.parseInt(JOptionPane.showInputDialog("Código projeto: "));
      for(Projeto projeto: projetos){
         if(projeto.getCodProjeto() != buscaCod){
            continue;
            }
            
                 JOptionPane.showMessageDialog(null, "++++ PROJETO ENCONTRADO ++++\nTítulo: " + projeto.getTitulo() + "\nOrçamento: " + projeto.getOrcamento() + "\nDuração: " + projeto.getDuracao() + "\nInstituicao: " + projeto.getInstituicao() + "\nÁrea relacionada: " + projeto.getAreaPesq() + "\nCódigo Projeto: " + projeto.getCodProjeto() + "\nResposta: " + projeto.getResposta() + "\n\n\n  ENTER para adicionar dados do novo projeto");
                 String titulo = JOptionPane.showInputDialog("======== ALTERAR DADOS DO PROJETO ENCONTRADO ========\n\nTítulo: ");
                 double orcamento = Double.parseDouble(JOptionPane.showInputDialog("======== ALTERAR DADOS DO PROJETO ENCONTRADO ========\n\nOrçamento do projeto: "));
                 String duracao = JOptionPane.showInputDialog("======== ALTERAR DADOS DO PROJETO ENCONTRADO ========\n\nDuração do projeto(meses): ");
                 String instituicao = JOptionPane.showInputDialog("======== ALTERAR DADOS DO PROJETO ENCONTRADO ========\n\nInsituição: ");
                 String areaPesq = JOptionPane.showInputDialog("======== ALTERAR DADOS DO PROJETO ENCONTRADO ========\n\nÁrea relacionada a pesquisa: ");
                 int codProjeto = Integer.parseInt(JOptionPane.showInputDialog("======== ALTERAR DADOS DO PROJETO ENCONTRADO ========\n\nCódigo do projeto: "));
                 
                 projeto.setTitulo(titulo);
                 projeto.setOrcamento(orcamento);
                 projeto.setDuracao(duracao);
                 projeto.setInstituicao(instituicao);
                 projeto.setAreaPesq(areaPesq);
                 projeto.setCodProjeto(codProjeto);
                 return;
         
         
      }
  } 
      
   
   
   
   public void buscaPorCodigo(){
   int buscaCod = Integer.parseInt(JOptionPane.showInputDialog("Código do projeto p/ remover: "));
      for(int i = 0; i < projetos.size(); i++){
         if(projetos.get(i).getCodProjeto() == buscaCod){
         JOptionPane.showMessageDialog(null, "++++ PROJETO ENCONTRADO ++++\nTítulo: " + projetos.get(i).getTitulo() + "\nOrçamento: " + projetos.get(i).getOrcamento() + "\nDuração: " + projetos.get(i).getDuracao() + "\nInstituicao: " + projetos.get(i).getInstituicao() + "\nÁrea relacionada: " + projetos.get(i).getAreaPesq() + "\nCódigo Projeto: " + projetos.get(i).getCodProjeto() + "\nResposta: " + projetos.get(i).getResposta());
         }
      }
   }
   public void buscaRemove(){
   int buscaCod = Integer.parseInt(JOptionPane.showInputDialog("Código do projeto p/ remover: "));
      for(int i = 0; i < projetos.size(); i++){
         if(projetos.get(i).getCodProjeto() == buscaCod){
            projetos.remove(i);
            JOptionPane.showMessageDialog(null, "Projeto removido.");
         }
      }
   }
}



import javax.swing.JOptionPane;
public class AgenciaApp{
   public static void main(String args[]){
   
      int menu;
   
      Agencia agencia = new Agencia();
      do {
      
         menu = Integer.parseInt(JOptionPane.showInputDialog("=-=-=-=-= AGENCIA DE PROJETOS =-=-=-=-=\n 1. Inserir um novo projeto;\n 2. Listar todos os projetos;\n 3. Atualizar a avaliação do projeto;\n 4. Excluir um projeto;\n 5. Listar um projeto pelo número; \n 6. Sair."));
      
         if(menu == 1){
            agencia.inserirProjeto();
         }
      
         if(menu == 2){
            agencia.listarProjetos();
         } 
         
         if(menu == 3){
            agencia.buscarProjeto();
            }
           
         if(menu == 4){
            agencia.buscaRemove();
         
         }
           
         if(menu == 5){
            agencia.buscaPorCodigo();
         }
                    
         if(menu == 6){
            System.exit(0);
            }
      }while(menu != 1 || menu != 2 || menu != 3 || menu != 4);
   
   }   
}

Nesse caso em que você apresenta uma string concatenada com os dados de todos os projetos, não faz sentido você utilizar o laço de repetição.

Se eu n coloco esse laço pra ver os projetos do arraylist, quando eu removo um projeto, ele continua listando os dados do projeto removido, por isso q coloquei

Justamente, isso acontece por que o projeto foi excluído da lista mas não da string, concorda ?
Independende do projeto que você remover da lista ele ainda existirá na string.
Nesse casso, dentro do seu médodo listar, você teria que montar a string de apresentação a partir da lista, feito isso bastaria apresentar a string logo em sequência fora do laço de repetição.

Não entendi muito bem, uso o laço pra ver qts projetos tem e a partir dai listar os atributos do projeto?

Teria que ficar desta forma:

public void listarProjetos(){
    String projetos = "";

    for(int i = 0; i < projetos.size(); i++){
       projetos += //Monte sua string de apresentação dos projetos Exemplo: "Título: " + projetos.get(i).getTitulo();    
    }

    JOptionPane.showMessageDialog(null, projetos);
}