Inserir vários componentes iguais em um JFrame

Pessoal, eu tenho uma classe que extende JFrame e gostaria de adicionar dinamicamente vários componentes iguais(a quantidade será variável).

Eu queria adicionar vários JPanel(cada um deles terá uma tabela com certos dados de um aluno) a este JFrame, mas precisa ser em tempo de execução, pois não se quantos será preciso.

Sò consegui adicionar um, não consigo adicionar mais de um.

Agradeço a atenção e fico no aguardo de ajuda.

Att,

Robert

Fala, Robertdm!

Bom, o post vai ficar muito grande se eu for encher de exemplos, então vamos diretamente ao que você quer.
Qual é o lance de criar os componentes dinamicamente? É possuir uma coleção dos dados que eu quero adicionar e iterar sobre esta coleção!

Por exemplo, suponhamos que eu tenha vários Tipos de Documentos e cada um desses tipos possui vários campos relativos a ele. Se eu iterar sobre esses tipos de documentos, eu trago os campos que cada um possui e adiciono em um painel específico.

Bom, vou fazer um exemplo de como você pode fazer esse lance com os alunos:

Usando o MigLayout…

public class AlunosForm extends JFrame
{
   private List<Aluno> alunos;
   
   // Perceba que o construtor receberá uma lista de alunos.
   // Estes serão os alunos sobre os quais iteraremos. (gostei dessa palavra xD)
   public AlunosForm(List<Aluno> alunos)
   {
      super( ".: Adicionando Componentes Dinamicamente :.");

      this.alunos = alunos != null ? alunos : new ArrayList<Aluno>();
      initingComponents();
   }

   private void initingComponents()
   {
      Container container = getContentPane();
      container.setLayout( new MigLayout() );

      // Para cada aluno que temos na coleção...
      for (Aluno aluno : alunos) {
     
         //construímos um JPanel específico para ele.
         container.add( getAlunoPanel( aluno ), "wrap");
      }
   }

   private JPanel getAlunoPanel( Aluno aluno )
   {
      JPanel panel = new JPanel( new MigLayout() );
      JLabel label; 
      
      label = new JLabel( "Aluno: " + aluno.getNome() );
      label.setFont( new Font("Tahoma", 1, 16) );
      panel.add( label, "wrap 20" );

      label = new JLabel("Valor da Mensalidade:");
      panel.add( label, "align right" );

      JTextField text = new JTextField( 20, aluno.getMensalidade() );
      panel.add( text, "align left, wrap" );

      // E assim 'substantivamente', como diria o célebre Seu Madruga.
   }
}

E agora, usando o GridBagLayout:

public class AlunosForm extends JFrame
{
   private List<Aluno> alunos;
   
   // Perceba que o construtor receberá uma lista de alunos.
   // Estes serão os alunos sobre os quais iteraremos. (gostei dessa palavra xD)
   public AlunosForm(List<Aluno> alunos)
   {
      super( ".: Adicionando Componentes Dinamicamente :.");

      this.alunos = alunos != null ? alunos : new ArrayList<Aluno>();
      initingComponents();
   }

   private void initingComponents()
   {
      Container container = getContentPane();
      container.setLayout( new GridBagLayout() );
      GridBagConstraints cc = new GridBagConstraints();

      cc.insets = new Insets( 5, 5, 5, 5 );
      cc.gridx = 0; cc.gridy = 0;

      // Para cada aluno que temos na coleção...
      for (Aluno aluno : alunos) {
     
         //construímos um JPanel específico para ele.
         container.add( getAlunoPanel( aluno ), cc);
         cc.gridx++;
      }
   }

   private JPanel getAlunoPanel( Aluno aluno )
   {
      JPanel panel = new JPanel( new GridBagLayout() );
      GridBagConstraints cc = new GridBagConstraints();
      JLabel label; 

      cc.insets = new Insets( 5, 5, 5, 5 );
      cc.gridx = 0; cc.gridy = 0;
      
      label = new JLabel( "Aluno: " + aluno.getNome() );
      label.setFont( new Font("Tahoma", 1, 16) );
      panel.add( label, cc );

      cc.gridx++;

      cc.anchor = GridBagConstraints.RIGHT;
      label = new JLabel("Valor da Mensalidade:");
      panel.add( label,  cc);

      cc.gridy++;
      cc.anchor = GridBagConstraints.LEFT;
      JTextField text = new JTextField( 20, aluno.getMensalidade() );
      panel.add( text, cc );

      cc.gridx++; cc.gridy = 0;
      // E assim 'substantivamente', como diria o célebre Seu Madruga.
   }
}

Deu pra ter uma ideia legal de como funciona?
Abraços!

Primeiramente, muito obrigado pela ajuda e disposição.

Entendi sim, vou testar aqui pra ver como fica. O que vou fazer na verdade é imprimir o boletin de cada aluno, ou seja, recebo uma lista de alunos com as notas e etc, então quero criar uma janela que tenha uma tabela com as notas para cada aluno, sendo que elas precisam ficar uma abaixo da outra dentro desta janela entende?

Este exemplos que me passou vão deixar os dados uma abaixo do outro? Ou seja, os panel criados para cada aluno, quando forem adicionados ao frame vão ficar um abaixo do outro?

Vou testar os exemplos que me passou.

Agradeço muito a ajuda!

Grande abraço.

Robert

Primeiramente, muito obrigado pela ajuda e disposição.

Entendi sim, vou testar aqui pra ver como fica. O que vou fazer na verdade é imprimir o boletin de cada aluno, ou seja, recebo uma lista de alunos com as notas e etc, então quero criar uma janela que tenha uma tabela com as notas para cada aluno, sendo que elas precisam ficar uma abaixo da outra dentro desta janela entende?

Este exemplos que me passou vão deixar os dados uma abaixo do outro? Ou seja, os panel criados para cada aluno, quando forem adicionados ao frame vão ficar um abaixo do outro?

Vou testar os exemplos que me passou.

Agradeço muito a ajuda!

Grande abraço.

Robert[/quote]

Sim, com este exemplo, cada painel será inserido um abaixo do outro.
Já que você comentou em imprimir, porque não gera um relatório com o iReport?
Você passa sua coleção de dados e o iReport trata de montar o relatório para ti!

Essa de gerar o relatório foi ótima, mas nunca usei e na verdade não conheço.

Teria algum exemplo pra me passar de como fazer? Pois, terei mesmo de gerar relatórios depois com os dados…

Grande abraço…

Essa de gerar o relatório foi ótima, mas nunca usei e na verdade não conheço.

Teria algum exemplo pra me passar de como fazer? Pois, terei mesmo de gerar relatórios depois com os dados…

Grande abraço…

[/quote]

Rapaz, também sei muito pouco sobre geração de relatórios com iReport.
“Googla” sobre isso que você acha umas coisas bacanas!

Eu consegui depois de muito custo o que queria, mas funcionou! =)

Abraços!

Olá, boa tarde.

estou tentando simular esse exemplo do Nicolas Fernandes, mas não estou conseguindo passar o parametro List alunos.
Alguem pode me ajudar a testar isso, por favor?

Desde já agradeço,
Irving Ellan.