O JtabbedPane funciona como um container de painéis, capaz de modularizar um formulário em diversas seções, em outras palavras, você consegue possibilitar a entrada de uma grande quantidade de informações sem a necessidade de possuir um formulário com uma dimensão que pode não caber no monitor do usuário.

É muito comum em sistemas que exigem o cadastro de informações detalhadas o uso do JtabbedPane. Por exemplo: O módulo da Caixa Econômica Federal responsável por realizar o cadastro de pessoas que desejam realizar um financiamento de uma casa própria, exige uma quantidade imensa de informações, fazendo com que seja inviável pedir todas essas informações em apenas uma tela, trazendo dois grandes problemas:

  1. Cansaço e Poluição visual;
  2. Dimensão inapropriada do formulário, exigindo que o usuário necessite de um monitor maior ou tenha que alterar a sua resolução para se adequar ao sistema;
Nota: Conheça a Formação Programador Java da DevMedia e saia na frente do mercado.

Usando JtabbedPane

Antes de iniciar a codificação propriamente dita mostraremos como nós queremos que nosso formulário fique na Figura 1.

Cadastro de Cliente
Figura 1. Cadastro de Cliente

O que podemos perceber na Figura 1 é utilização de várias abas, quatro mais precisamente, para completar o cadastro de um cliente. Além de possuir os botões de 'Proximo' e 'Anterior' para navegar nas abas sem a necessidade de clicar nelas.

Vamos começar definindo os componentes que utilizaremos e entender passo a passo como foi feita a definição de cada um.


private void initComponents() {
 //(1)
  jTabbedPaneContainer = new javax.swing.JTabbedPane();
  jPanelGeral = new javax.swing.JPanel();
  jPanelProfissional = new javax.swing.JPanel();       
  jPanelPessoal = new javax.swing.JPanel();
  jPanelObservacao = new javax.swing.JPanel();
  jTabbedPaneContainer.add("Geral", jPanelGeral);
 jTabbedPaneContainer.add("Profissional", jPanelProfissional);
 jTabbedPaneContainer.add("Pessoal", jPanelPessoal);
 jTabbedPaneContainer.add("Observação", jPanelObservacao);
  
  //(2)
  jLabel3 = new javax.swing.JLabel();
  jTextFieldCargo = new javax.swing.JTextField();
  jLabel4 = new javax.swing.JLabel();
  jTextFieldTipoSanguineo = new javax.swing.JTextField();
  jScrollPane1 = new javax.swing.JScrollPane();
  jTextAreaObservacao = new javax.swing.JTextArea();
  jButtonProximo = new javax.swing.JButton();
  jButtonAnterior = new javax.swing.JButton();
  jLabel1 = new javax.swing.JLabel();
  jTextFieldNome = new javax.swing.JTextField();
  
  //(3)
  jLabel1.setText("Nome");
  jLabel4.setText("Tipo Sangu\u00edneo");
  setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
  setTitle("Cadastro de Cliente");
  jLabel3.setText("Cargo");
  jTextAreaObservacao.setColumns(20);
  jTextAreaObservacao.setRows(5);
  jScrollPane1.setViewportView(jTextAreaObservacao);
  jButtonProximo.setText("Proximo");
  jButtonProximo.addActionListener(new java.awt.event.ActionListener() {
      public void actionPerformed(java.awt.event.ActionEvent evt) {
          jButtonProximoActionPerformed(evt);
      }
  });

  jButtonAnterior.setText("Anterior");
  jButtonAnterior.addActionListener(new java.awt.event.ActionListener() {
      public void actionPerformed(java.awt.event.ActionEvent evt) {
          jButtonAnteriorActionPerformed(evt);
      }
  });
  
  
  //(4)
  javax.swing.GroupLayout jPanelGeralLayout = 
  new javax.swing.GroupLayout(jPanelGeral);
  jPanelGeral.setLayout(jPanelGeralLayout);
  jPanelGeralLayout.setHorizontalGroup(
      jPanelGeralLayout.createParallelGroup
      (javax.swing.GroupLayout.Alignment.LEADING)
      .addGroup(jPanelGeralLayout.createSequentialGroup()
          .addContainerGap()
          .addGroup(jPanelGeralLayout.createParallelGroup
          (javax.swing.GroupLayout.Alignment.LEADING)
              .addComponent(jTextFieldNome, javax.swing
              .GroupLayout.PREFERRED_SIZE, 228, javax.swing
              .GroupLayout.PREFERRED_SIZE)
              .addComponent(jLabel1))
          .addContainerGap(137, Short.MAX_VALUE))
  );
  jPanelGeralLayout.setVerticalGroup(
      jPanelGeralLayout.createParallelGroup(javax.swing.
      GroupLayout.Alignment.LEADING)
      .addGroup(jPanelGeralLayout.createSequentialGroup()
          .addContainerGap()
          .addComponent(jLabel1)
          .addPreferredGap(javax.swing.LayoutStyle.
          ComponentPlacement.RELATED)
          .addComponent(jTextFieldNome, javax.swing.
          GroupLayout.PREFERRED_SIZE, javax.swing.
          GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout
          .PREFERRED_SIZE)
          .addContainerGap(28, Short.MAX_VALUE))
  );
  
  
  

  javax.swing.GroupLayout jPanelProfissionalLayout = new 
  javax.swing.GroupLayout(jPanelProfissional);
  jPanelProfissional.setLayout(jPanelProfissionalLayout);
  jPanelProfissionalLayout.setHorizontalGroup(
      jPanelProfissionalLayout.createParallelGroup
      (javax.swing.GroupLayout.Alignment.LEADING)
      .addGroup(jPanelProfissionalLayout.createSequentialGroup()
          .addContainerGap()
          .addGroup(jPanelProfissionalLayout
          .createParallelGroup(javax.swing.GroupLayout
          .Alignment.LEADING)
              .addComponent(jTextFieldCargo, javax.swing
              .GroupLayout.PREFERRED_SIZE, 211, javax.swing
              .GroupLayout.PREFERRED_SIZE)
              .addComponent(jLabel3))
          .addContainerGap(154, Short.MAX_VALUE))
  );
  jPanelProfissionalLayout.setVerticalGroup(
      jPanelProfissionalLayout.createParallelGroup(javax
      .swing.GroupLayout.Alignment.LEADING)
      .addGroup(jPanelProfissionalLayout.createSequentialGroup()
          .addContainerGap()
          .addComponent(jLabel3)
          .addPreferredGap(javax.swing.LayoutStyle
          .ComponentPlacement.RELATED)
          .addComponent(jTextFieldCargo, javax.swing
          .GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout
          .DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
          .addContainerGap(28, Short.MAX_VALUE))
  );
  
 

  javax.swing.GroupLayout jPanelPessoalLayout = 
  new javax.swing.GroupLayout(jPanelPessoal);
  jPanelPessoal.setLayout(jPanelPessoalLayout);
  jPanelPessoalLayout.setHorizontalGroup(
      jPanelPessoalLayout.createParallelGroup
      (javax.swing.GroupLayout.Alignment.LEADING)
      .addGroup(jPanelPessoalLayout.createSequentialGroup()
          .addContainerGap()
          .addGroup(jPanelPessoalLayout.createParallelGroup
          (javax.swing.GroupLayout.Alignment.TRAILING, false)
              .addComponent(jTextFieldTipoSanguineo, javax
              .swing.GroupLayout.Alignment.LEADING)
              .addComponent(jLabel4, javax.swing.GroupLayout
              .Alignment.LEADING, javax.swing.GroupLayout
              .DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, 
              Short.MAX_VALUE))
          .addContainerGap(255, Short.MAX_VALUE))
  );
  jPanelPessoalLayout.setVerticalGroup(
      jPanelPessoalLayout.createParallelGroup(javax.swing
      .GroupLayout.Alignment.LEADING)
      .addGroup(jPanelPessoalLayout.createSequentialGroup()
          .addContainerGap()
          .addComponent(jLabel4)
          .addPreferredGap(javax.swing.LayoutStyle
          .ComponentPlacement.RELATED)
          .addComponent(jTextFieldTipoSanguineo, javax.swing
          .GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout
          .DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
          .addContainerGap(28, Short.MAX_VALUE))
  );
  
  

  javax.swing.GroupLayout jPanelObservacaoLayout = new javax
  .swing.GroupLayout(jPanelObservacao);
  jPanelObservacao.setLayout(jPanelObservacaoLayout);
  jPanelObservacaoLayout.setHorizontalGroup(
      jPanelObservacaoLayout.createParallelGroup(javax.swing
      .GroupLayout.Alignment.LEADING)
      .addComponent(jScrollPane1, javax.swing.GroupLayout
      .Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE,
       377, Short.MAX_VALUE)
  );
  jPanelObservacaoLayout.setVerticalGroup(
      jPanelObservacaoLayout.createParallelGroup(javax.swing
      .GroupLayout.Alignment.LEADING)
      .addGroup(jPanelObservacaoLayout.createSequentialGroup()
          .addComponent(jScrollPane1, javax.swing.GroupLayout
          .PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE
          , javax.swing.GroupLayout.PREFERRED_SIZE)
          .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE
          , Short.MAX_VALUE))
  );        
  
  javax.swing.GroupLayout layout = new javax.swing
  .GroupLayout(getContentPane());
  getContentPane().setLayout(layout);
  layout.setHorizontalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout
      .Alignment.LEADING)
      .addComponent(jTabbedPaneContainer, javax.swing
      .GroupLayout.DEFAULT_SIZE, 382, Short.MAX_VALUE)
      .addGroup(layout.createSequentialGroup()
          .addContainerGap()
          .addComponent(jButtonProximo)
          .addPreferredGap(javax.swing.LayoutStyle
          .ComponentPlacement.RELATED)
          .addComponent(jButtonAnterior)
          .addContainerGap(182, Short.MAX_VALUE))
  );
  layout.setVerticalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout
      .Alignment.LEADING)
      .addGroup(layout.createSequentialGroup()
          .addContainerGap()
          .addComponent(jTabbedPaneContainer, javax.swing
          .GroupLayout.PREFERRED_SIZE, 107, javax.
          swing.GroupLayout.PREFERRED_SIZE)
          .addPreferredGap(javax.swing.LayoutStyle.
          ComponentPlacement.RELATED, javax.swing.
          GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
          .addGroup(layout.createParallelGroup(javax.
          swing.GroupLayout.Alignment.BASELINE)
              .addComponent(jButtonProximo)
              .addComponent(jButtonAnterior))
          .addContainerGap())
  );
  pack();
}
Listagem 1. Criação dos componentes

Dado o código da Listagem 1 já temos a definição completa do nosso JtabbedPane e as configurações necessárias para disposição do formulário conforme a Figura 1, mas agora vamos entender o que foi feito de acordo com os comentários numerados em cada bloco.

  1. Neste bloco temos que realmente necessitamos aprender neste artigo, ou seja, o nosso objetivo principal de estudo. Criamos um JtabbedPane chamado jTabbedPaneContainer e logo depois criamos quatro Jpanel: jPanelGeral, jPanelProfissional, jPanelPessoal, jPanelObservacao.

    Com todos os Jpanel's criados, nós adicionamos eles ao nosso JtabbedPane, através do método add() disponibilizado pela classe JtabbedPane. Perceba que aqui podemos adicionar quantos painéis forem necessários e as abas vão sendo criadas, visualmente falando. Imagine que o JtabbedPane é uma cuba de ovo e os Jpanel's são os ovos, ou seja, um container que armazena itens menores.

    Poderíamos ir ainda mais adiante, colocando um JtabbedPane dentro de outro JtabbedPane, tornando ainda mais modular o nosso formulário, mas isso fica como exercício para você, caro leitor. O método add() que usamos para adicionar os painéis no JtabbedPane recebe dois parâmetros: O título da sua aba e o objeto que faz referência ao painel. Este foi o add() que optamos usar, porém existem mais formas de usar o add(), como por exemplo passando o painel e o índice de onde ele será inserido, ou passando apenas o painel e etc.

  2. Temos aqui a criação de outros componentes definidos dentro do nosso formulário, como por exemplo: label's, inputText's e etc.
  3. Após a definição destes componentes, nós configuramos alguns de seus atributos como: nome, tamanho e etc. Não entraremos nos detalhes da definição de cada um destes componentes pois o nosso foco é o JtabbedPane.
  4. Após criação, configuração e definição dos componentes necessários. Nós precisamos definir a sua disposição no formulário e fazemos isso com a definição de layouts.
  5. A criação do JtabbedPane é simples porém pode confundir muito se o desenvolvedor não tiver ideia de como utilizá-lo, por isso é muito importante a prática e uso de tal componente. Perceba que ainda temos que criar a lógica dos nossos botões 'Proximo' e 'Anteior' que fará a navegação através do nosso JtabbedPane.

  private void jButtonAnteriorActionPerformed(java.awt.event.ActionEvent evt) 
  {//GEN-FIRST:event_jButtonAnteriorActionPerformed
         int i = jTabbedPaneContainer.getSelectedIndex();
         
         if (i == 0){
               jTabbedPaneContainer.setSelectedIndex(jTabbedPaneContainer
               .getComponentCount()-1);
         }else{
               jTabbedPaneContainer.setSelectedIndex(i-1);
         }
      }//GEN-LAST:event_jButtonAnteriorActionPerformed
   
      private void jButtonProximoActionPerformed(java.awt.event
      .ActionEvent evt) {//GEN-FIRST:event_jButtonProximoActionPerformed
         int i = jTabbedPaneContainer.getSelectedIndex();
         
         if (jTabbedPaneContainer.getComponentCount() - 1 == i){
               jTabbedPaneContainer.setSelectedIndex(0);
         }else{
               jTabbedPaneContainer.setSelectedIndex(i+1);
         }
      }//GEN-LAST:event_jButtonProximoActionPerformed
Listagem 2. Navegando no JtabbedPane

Vamos entender o código da Listagem 2:

  1. jButtonAnteriorActionPerformed: Temos a criação da lógica para voltar 1 aba. Capturamos o índice da aba selecionada e armazenamos na variável i, após isso nós checamos se o valor de i é igual a 0, pois caso seja verdade então significa que o usuário ainda está na primeira aba e não poderá voltar. Neste caso em específico nós iremos direcioná-lo para a última aba, dando ideia de um movimento circular, sem fim.

    Para direcioná-lo para a última aba nós usamos o método setSelectedIndex() onde deveremos passar a aba que devemos que seja selecionada/focada. Como sabemos que desejamos ir para a última aba, então capturamos a quantidade de painéis/abas existentes no nosso container JTabbedPane através do método getComponentCount() diminuindo o valor de 1 pois a contagem começa em 0.

    Caso o usuário esteja em qualquer aba que não seja a primeira (igual a 0) então nós simplesmente usamos o setSelectedIndex() passando o valor selecionado atualmente -1 para que ele possa voltar uma aba.

  2. jButtonProximoActionPerformed: A lógica do botão Próximo é um pouco parecida com a do botão Anterior, continuando com o movimento circular, porém agora adicionando sempre +1. Vejamos: Logo checamos se a aba selecionada é correspondente a última aba, pois caso isso seja verdade nós iremos colocar a seleção na primeira aba. Lembre-se que a contagem de índices selecionados sempre começa em zero, por isso devemos sempre diminuir o valor de -1 ao capturar a quantidade de painéis existentes no nosso JtabbedPane. Caso a aba selecionada seja qualquer uma diferente da última, nós simplesmente usamos o método setSelectedIndex() passando o valor selecionado atual +1.

Por fim, temos a definição completa do nosso JtabbedPane com toda a lógica necessária para seu funcionamento adequado. Vejamos na Listagem 3 como ficou nossa classe/formulário final que chamamos de AppTabbed.java.


public class AppTabbed extends javax.swing.JFrame {
 
    public AppTabbed() {
        initComponents();
    }
 
    private void initComponents() {
       //(1)
        jTabbedPaneContainer = new javax.swing.JTabbedPane();
        jPanelGeral = new javax.swing.JPanel();
        jPanelProfissional = new javax.swing.JPanel();       
        jPanelPessoal = new javax.swing.JPanel();
        jPanelObservacao = new javax.swing.JPanel();
        jTabbedPaneContainer.add("Geral", jPanelGeral);
       jTabbedPaneContainer.add("Profissional", jPanelProfissional);
       jTabbedPaneContainer.add("Pessoal", jPanelPessoal);
       jTabbedPaneContainer.add("Observação", jPanelObservacao);
        
        //(2)
        jLabel3 = new javax.swing.JLabel();
        jTextFieldCargo = new javax.swing.JTextField();
        jLabel4 = new javax.swing.JLabel();
        jTextFieldTipoSanguineo = new javax.swing.JTextField();
        jScrollPane1 = new javax.swing.JScrollPane();
        jTextAreaObservacao = new javax.swing.JTextArea();
        jButtonProximo = new javax.swing.JButton();
        jButtonAnterior = new javax.swing.JButton();
        jLabel1 = new javax.swing.JLabel();
        jTextFieldNome = new javax.swing.JTextField();
        
        //(3)
        jLabel1.setText("Nome");
        jLabel4.setText("Tipo Sangu\u00edneo");
        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("Cadastro de Cliente");
        jLabel3.setText("Cargo");
        jTextAreaObservacao.setColumns(20);
        jTextAreaObservacao.setRows(5);
        jScrollPane1.setViewportView(jTextAreaObservacao);
        jButtonProximo.setText("Proximo");
        jButtonProximo.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButtonProximoActionPerformed(evt);
            }
        });
 
        jButtonAnterior.setText("Anterior");
        jButtonAnterior.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButtonAnteriorActionPerformed(evt);
            }
        });
        
        
        //(4)
        javax.swing.GroupLayout jPanelGeralLayout = new javax.swing
        .GroupLayout(jPanelGeral);
        jPanelGeral.setLayout(jPanelGeralLayout);
        jPanelGeralLayout.setHorizontalGroup(
            jPanelGeralLayout.createParallelGroup(javax.swing
            .GroupLayout.Alignment.LEADING)
            .addGroup(jPanelGeralLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanelGeralLayout.createParallelGroup
                (javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jTextFieldNome, javax.swing.
                    GroupLayout.PREFERRED_SIZE, 228, javax.swing
                    .GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel1))
                .addContainerGap(137, Short.MAX_VALUE))
        );
        jPanelGeralLayout.setVerticalGroup(
            jPanelGeralLayout.createParallelGroup(javax.swing
            .GroupLayout.Alignment.LEADING)
            .addGroup(jPanelGeralLayout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jLabel1)
                .addPreferredGap(javax.swing.LayoutStyle
                .ComponentPlacement.RELATED)
                .addComponent(jTextFieldNome, javax.swing
                .GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout
                .DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(28, Short.MAX_VALUE))
        );
        
        
        
 
        javax.swing.GroupLayout jPanelProfissionalLayout = new javax
        .swing.GroupLayout(jPanelProfissional);
        jPanelProfissional.setLayout(jPanelProfissionalLayout);
        jPanelProfissionalLayout.setHorizontalGroup(
            jPanelProfissionalLayout.createParallelGroup(javax.swing
            .GroupLayout.Alignment.LEADING)
            .addGroup(jPanelProfissionalLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanelProfissionalLayout.createParallelGroup
                (javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jTextFieldCargo, javax.swing
                    .GroupLayout.PREFERRED_SIZE, 211, javax.swing
                    .GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel3))
                .addContainerGap(154, Short.MAX_VALUE))
        );
        jPanelProfissionalLayout.setVerticalGroup(
            jPanelProfissionalLayout.createParallelGroup
            (javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanelProfissionalLayout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jLabel3)
                .addPreferredGap(javax.swing.LayoutStyle.
                ComponentPlacement.RELATED)
                .addComponent(jTextFieldCargo, javax.swing.
                GroupLayout.PREFERRED_SIZE, javax.swing.
                GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.
                PREFERRED_SIZE)
                .addContainerGap(28, Short.MAX_VALUE))
        );
        
       
 
        javax.swing.GroupLayout jPanelPessoalLayout = new javax.
        swing.GroupLayout(jPanelPessoal);
        jPanelPessoal.setLayout(jPanelPessoalLayout);
        jPanelPessoalLayout.setHorizontalGroup(
            jPanelPessoalLayout.createParallelGroup(javax.swing
            .GroupLayout.Alignment.LEADING)
            .addGroup(jPanelPessoalLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanelPessoalLayout.createParallelGroup
                (javax.swing.GroupLayout.Alignment.TRAILING, false)
                    .addComponent(jTextFieldTipoSanguineo, javax
                    .swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jLabel4, javax.swing.GroupLayout
                    .Alignment.LEADING, javax.swing.GroupLayout
                    .DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, 
                    Short.MAX_VALUE))
                .addContainerGap(255, Short.MAX_VALUE))
        );
        jPanelPessoalLayout.setVerticalGroup(
            jPanelPessoalLayout.createParallelGroup(javax.swing.GroupLayout
            .Alignment.LEADING)
            .addGroup(jPanelPessoalLayout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jLabel4)
                .addPreferredGap(javax.swing.LayoutStyle
                .ComponentPlacement.RELATED)
                .addComponent(jTextFieldTipoSanguineo, javax.swing
                .GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout
                .DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(28, Short.MAX_VALUE))
        );
        
        
 
        javax.swing.GroupLayout jPanelObservacaoLayout = new javax
        .swing.GroupLayout(jPanelObservacao);
        jPanelObservacao.setLayout(jPanelObservacaoLayout);
        jPanelObservacaoLayout.setHorizontalGroup(
            jPanelObservacaoLayout.createParallelGroup(javax.swing
            .GroupLayout.Alignment.LEADING)
            .addComponent(jScrollPane1, javax.swing.GroupLayout.Alignment
            .TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 377, 
            Short.MAX_VALUE)
        );
        jPanelObservacaoLayout.setVerticalGroup(
            jPanelObservacaoLayout.createParallelGroup(javax.swing
            .GroupLayout.Alignment.LEADING)
            .addGroup(jPanelObservacaoLayout.createSequentialGroup()
                .addComponent(jScrollPane1, javax.swing.GroupLayout
                .PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, 
                javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, 
                Short.MAX_VALUE))
        );        
        
        javax.swing.GroupLayout layout = new javax.swing.
        GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout
            .Alignment.LEADING)
            .addComponent(jTabbedPaneContainer, javax.swing.GroupLayout
            .DEFAULT_SIZE, 382, Short.MAX_VALUE)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jButtonProximo)
                .addPreferredGap(javax.swing.LayoutStyle.
                ComponentPlacement.RELATED)
                .addComponent(jButtonAnterior)
                .addContainerGap(182, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout
            .Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jTabbedPaneContainer, javax.swing
                .GroupLayout.PREFERRED_SIZE, 107, javax.swing
                .GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle
                .ComponentPlacement.RELATED, javax.swing.GroupLayout
                .DEFAULT_SIZE, Short.MAX_VALUE)
                .addGroup(layout.createParallelGroup(javax.swing
                .GroupLayout.Alignment.BASELINE)
                    .addComponent(jButtonProximo)
                    .addComponent(jButtonAnterior))
                .addContainerGap())
        );
        pack();
    }
    
    private void jButtonAnteriorActionPerformed(java.awt.event
    .ActionEvent evt) {//GEN-FIRST:event_jButtonAnteriorActionPerformed
       int i = jTabbedPaneContainer.getSelectedIndex();
       
       if (i == 0){
             jTabbedPaneContainer.setSelectedIndex
             (jTabbedPaneContainer.getComponentCount()-1);
       }else{
             jTabbedPaneContainer.setSelectedIndex(i-1);
       }
    }//GEN-LAST:event_jButtonAnteriorActionPerformed
 
    private void jButtonProximoActionPerformed
    (java.awt.event.ActionEvent evt) {//GEN-FIRST:
    event_jButtonProximoActionPerformed
       int i = jTabbedPaneContainer.getSelectedIndex();
       
       if (jTabbedPaneContainer.getComponentCount() - 1 == i){
             jTabbedPaneContainer.setSelectedIndex(0);
       }else{
             jTabbedPaneContainer.setSelectedIndex(i+1);
       }
    }//GEN-LAST:event_jButtonProximoActionPerformed
    
    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new AppTabbed().setVisible(true);
            }
        });
    }
    
    // Declaração de variáveis
    private javax.swing.JButton jButtonAnterior;
    private javax.swing.JButton jButtonProximo;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JPanel jPanelGeral;
    private javax.swing.JPanel jPanelObservacao;
    private javax.swing.JPanel jPanelPessoal;
    private javax.swing.JPanel jPanelProfissional;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTabbedPane jTabbedPaneContainer;
    private javax.swing.JTextArea jTextAreaObservacao;
    private javax.swing.JTextField jTextFieldCargo;
    private javax.swing.JTextField jTextFieldNome;
    private javax.swing.JTextField jTextFieldTipoSanguineo;
    // Fim da declaração de variáveis
    
}
Listagem 3. AppTabbed.java

Com este artigo podemos assimilar o uso adequado do componente JtabbedPane que é muito utilizado para formulário que exigem grande quantidade de informações a serem inseridas. Vale ressaltar que abordamos as principais funcionalidades que são usadas neste componente, mas indo mais a fundo na documentação da Oracle, podemos ver mais métodos para manipulação deste. Fica como exercício, para você leitor, estudar mais a fundo os métodos disponíveis na documentação da Oracle para o JtabbedPane e utilizá-los dentro da classe AppTabbed mostrada acima.