Determinando a ordem dos componentes em Swing

Há alguns meses atrás foi feita uma pergunta na lista do genesis cuja resposta envolvia saber como determinar a ordem dos componentes numa interface Swing.

Quando falamos de ordem do ponto de vista do usuário, não necessariamente falamos da ordem em profundidade, que refletiria a “árvore” dos componentes em determinado container, mas sim a ordem de foco. Existe uma interface que foi adicionada no Java 1.4 chamada FocusTraversalPolicy, que serve justamente para isso. Abaixo um exemplo de como determinar a ordem usando os nomes de componentes dados por quem fez a pergunta:

package br.com.michaelnascimento.test;

import java.awt.Component;
import java.awt.EventQueue;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.WindowConstants;
import org.jdesktop.layout.GroupLayout;
import org.jdesktop.layout.LayoutStyle;

public class ComponentOrder extends JFrame {
   public ComponentOrder() {
      initComponents();
   }

   private void findOrder() {
      List<Component> components = Arrays.asList(new Component[] {login, senha,
            endereco, empresa});
      Collections.shuffle(components);

      for (Component component : components) {
         System.out.println(component.getName());
      }

      Map<Component, Integer> componentPerPosition = new HashMap<Component,
            Integer>();
      Component c = getFocusTraversalPolicy().getFirstComponent(this);
      int position = 0;

      while (componentPerPosition.size() < components.size()) {
         if (c == null) {
            break;
         }

         if (components.contains(c)) {
            componentPerPosition.put(c, position);
         }

         position++;
         c = getFocusTraversalPolicy().getComponentAfter(this, c);
      }

      for (Component component : components) {
         System.out.println(component.getName() + ": " + componentPerPosition.
               get(component));
      }
   }

   // <editor-fold defaultstate="collapsed" desc="Generated Code">
   private void initComponents() {

      jPanel1 = new JPanel();
      login = new JTextField();
      senha = new JTextField();
      endereco = new JTextField();
      empresa = new JTextField();

      setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

      jPanel1.setName("jPanel1"); // NOI18N

      login.setText("jTextField1");
      login.setName("login"); // NOI18N

      senha.setText("jTextField1");
      senha.setName("senha"); // NOI18N

      GroupLayout jPanel1Layout = new GroupLayout(jPanel1);
      jPanel1.setLayout(jPanel1Layout);
      jPanel1Layout.setHorizontalGroup(
         jPanel1Layout.createParallelGroup(GroupLayout.LEADING)
         .add(jPanel1Layout.createSequentialGroup()
            .addContainerGap()
            .add(jPanel1Layout.createParallelGroup(GroupLayout.LEADING)
               .add(login, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
               .add(senha, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
            .addContainerGap(31, Short.MAX_VALUE))
      );
      jPanel1Layout.setVerticalGroup(
         jPanel1Layout.createParallelGroup(GroupLayout.LEADING)
         .add(jPanel1Layout.createSequentialGroup()
            .addContainerGap()
            .add(login, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
            .addPreferredGap(LayoutStyle.RELATED)
            .add(senha, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
            .addContainerGap(43, Short.MAX_VALUE))
      );

      endereco.setText("jTextField1");
      endereco.setName("endereco"); // NOI18N

      empresa.setText("jTextField1");
      empresa.setName("empresa"); // NOI18N

      GroupLayout layout = new GroupLayout(getContentPane());
      getContentPane().setLayout(layout);
      layout.setHorizontalGroup(
         layout.createParallelGroup(GroupLayout.LEADING)
         .add(layout.createSequentialGroup()
            .addContainerGap()
            .add(layout.createParallelGroup(GroupLayout.LEADING)
               .add(jPanel1, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
               .add(endereco, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
               .add(empresa, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
            .addContainerGap(290, Short.MAX_VALUE))
      );
      layout.setVerticalGroup(
         layout.createParallelGroup(GroupLayout.LEADING)
         .add(layout.createSequentialGroup()
            .addContainerGap()
            .add(jPanel1, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
            .addPreferredGap(LayoutStyle.RELATED)
            .add(endereco, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
            .addPreferredGap(LayoutStyle.RELATED)
            .add(empresa, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
            .addContainerGap(137, Short.MAX_VALUE))
      );

      pack();
   }// </editor-fold>

   public static void main(String args[]) {
      EventQueue.invokeLater(new Runnable() {
         @Override
         public void run() {
            final ComponentOrder co = new ComponentOrder();
            co.setVisible(true);
            co.findOrder();
         }
      });
   }
   // Variables declaration - do not modify
   private JTextField empresa;
   private JTextField endereco;
   private JPanel jPanel1;
   private JTextField login;
   private JTextField senha;
   // End of variables declaration
}

Comments are closed.