[Ajuda] Gerenciadores de Layout

Olá,

Estou com dúvidas pra montar a organização da janela para um sistema que estou fazendo para treinar programação.

Eu gostaria de fazer 1 jlabel e 1 jtextfield na mesma linha, a cada linha.
E por último os botões, embaixo.

Esta quase montado do jeito que quero, mas a tela para 1 JLabel e 1 JTextfield não está saindo como eu queria, pois não sai o conjunto “label” + “textfield” em cada linha. Não sei como fazer, estou tentando. Está aparecendo mais de 2 campos por linha, conforme está na imagem:

Alguém pode dar uma dica de como arrumar pra sair 1 label e 1 textfield por linha e os botões serem mantidos lá embaixo mesmo?

Código:

import java.awt.Container;  
import java.awt.GridLayout;
import java.awt.BorderLayout;   

import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

import javax.swing.JButton;  
import javax.swing.JFrame;  
import javax.swing.JLabel;  
import javax.swing.JOptionPane;  
import javax.swing.JPasswordField;  
import javax.swing.JTextField;  
import javax.swing.JPanel;



public class Sistema extends JFrame{  

    
	JButton novo = new JButton("Novo"); 
    JButton gravar = new JButton("Gravar");
	JButton editar = new JButton("Editar");
	JButton apagar = new JButton("Apagar");
	JButton sair = new JButton("Sair");  
	
    JTextField clienteId = new JTextField();       // Código do cliente
    JTextField nomeCliente = new JTextField();     // Nome
	JTextField ruaCliente = new JTextField();      // Rua
	JTextField numeroCliente = new JTextField();   // Número
	JTextField bairroCliente = new JTextField();   // Bairro
    JTextField cidadeCliente = new JTextField();   // Cidade
	JTextField estadoCliente = new JTextField();   // Estado
	JTextField paisCliente = new JTextField();     // País
	JTextField cepCliente = new JTextField();      // CEP
	JTextField telefoneCliente = new JTextField(); // Telefone
	JTextField emailCliente = new JTextField();    // Email
	
	JPanel painelCentral = new JPanel();
	JPanel painelInferior = new JPanel();
	
    public Sistema ()
	{  
        super("Sistema de Petshop");  

        this.setLayout(new BorderLayout());
		
		painelCentral.setLayout(new GridLayout(10,2));
		painelInferior.setLayout(new GridLayout());
		
		painelCentral.add(new JLabel ("ID do cliente: "));  
        painelCentral.add(clienteId);  // campo textfield clienteId
		
        painelCentral.add(new JLabel ("Nome do cliente: "));  
        painelCentral.add(nomeCliente);  // campo textfield nomeCliente

		painelCentral.add(new JLabel ("Rua: "));  
        painelCentral.add(ruaCliente);  // campo textfield ruaCliente

        painelCentral.add(new JLabel ("Número: "));  
        painelCentral.add(numeroCliente);  // campo textfield numeroCliente

        painelCentral.add(new JLabel ("Bairro: "));  
        painelCentral.add(bairroCliente);  // campo textfield bairroCliente
		
		painelCentral.add(new JLabel ("Cidade: "));  
        painelCentral.add(cidadeCliente);  // campo textfield cidadeCliente
		
		painelCentral.add(new JLabel ("Estado: "));  
        painelCentral.add(estadoCliente);  // campo textfield estadoCliente
		
		painelCentral.add(new JLabel ("País: "));  
        painelCentral.add(paisCliente);   // campo textfield paisCliente
		
		painelCentral.add(new JLabel ("CEP: "));  
        painelCentral.add(cepCliente);   // campo textfield cepCliente
		
		painelCentral.add(new JLabel ("Telefone: "));  
        painelCentral.add(telefoneCliente);  // campo textfield telefoneCliente
		
		painelCentral.add(new JLabel ("Email: "));  
        painelCentral.add(emailCliente);  // campo textfield emailCliente
		
		
		
        painelInferior.add(novo);// add o botão 'Novo' no JFrame
        painelInferior.add(gravar);// add o botão 'Gravar' no JFrame
		painelInferior.add(editar);// add o botão 'Editar' no JFrame
		painelInferior.add(apagar);// add o botão 'Apagar' no JFrame
		painelInferior.add(sair);// add o botão 'Sair' no JFrame

		this.add(painelCentral, BorderLayout.CENTER);
		this.add(painelInferior, BorderLayout.SOUTH);
        
        //TextFieldHandler handlerTextField = new TextFieldHandler();
		//clienteId.addActionListener(handlerTextField);
		//nomeCliente.addActionListener(handlerTextField);
		
		ButtonHandler handlerButton = new ButtonHandler();
		novo.addActionListener(handlerButton);
		gravar.addActionListener(handlerButton);
		editar.addActionListener(handlerButton);
		apagar.addActionListener(handlerButton);
		sair.addActionListener(handlerButton);
		
		setSize(800,600);
        setVisible(true);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
	}
	   /*
	    private class TextFieldHandler implements ActionListener
		{
			public void actionPerformed(ActionEvent event)
			{
				String conteudoTextField = "";
				
				// Usuário pressionou <Enter> no JTextField 'login'
				if(event.getSource() == login)
				{
					conteudoTextField = String.format("%s",event.getActionCommand());
				}
				else // Usuário pressinou <Enter> no JPasswordField 'senha'
				if (event.getSource() == senha)
				{
					conteudoTextField = String.format("%s",event.getActionCommand());
				}
				
				JOptionPane.showMessageDialog(null,conteudoTextField);
				
				
			}
		}*/
		
		private class ButtonHandler implements ActionListener
		{
			public void actionPerformed(ActionEvent event)
			{
				String botaoClicado = "";
				
                if (event.getSource() == gravar)
				JOptionPane.showMessageDialog(null,"Botao Gravar clicado. Cliente ID: " + clienteId.getText());
		        else
				if (event.getSource() == sair)
				JOptionPane.showMessageDialog(null,"Botao Sair clicado");
			    // event.getActionCommand() -> Para um evento JButton, o método getActionCommand de ActionEvent
				// retorna o rótulo no JButton
			}
		}
		

    public static void main(String[] args) {


        new Sistema();
    }




}

Obrigado.

Consegui fazer o que queria.

Não está a janela perfeita mas ja da pra trabalhar encima desse layout.

Eu estava errando nos calculos do GridLayout(). São 22 componentes. Coloquei GridLayout(11,2) e ficou alinhado corretamente.

Código:

import java.awt.Container;  
import java.awt.GridLayout;
import java.awt.BorderLayout;   

import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

import javax.swing.JButton;  
import javax.swing.JFrame;  
import javax.swing.JLabel;  
import javax.swing.JOptionPane;  
import javax.swing.JPasswordField;  
import javax.swing.JTextField;  
import javax.swing.JPanel;



public class Sistema extends JFrame{  

    
	JButton novo = new JButton("Novo"); 
    JButton gravar = new JButton("Gravar");
	JButton editar = new JButton("Editar");
	JButton apagar = new JButton("Apagar");
	JButton sair = new JButton("Sair");  
	
    JTextField clienteId = new JTextField();       // Código do cliente
    JTextField nomeCliente = new JTextField();     // Nome
	JTextField ruaCliente = new JTextField();      // Rua
	JTextField numeroCliente = new JTextField();   // Número
	JTextField bairroCliente = new JTextField();   // Bairro
    JTextField cidadeCliente = new JTextField();   // Cidade
	JTextField estadoCliente = new JTextField();   // Estado
	JTextField paisCliente = new JTextField();     // País
	JTextField cepCliente = new JTextField();      // CEP
	JTextField telefoneCliente = new JTextField(); // Telefone
	JTextField emailCliente = new JTextField();    // Email
	
	JPanel painelCentral = new JPanel();
	JPanel painelInferior = new JPanel();
	
    public Sistema ()
	{  
        super("Sistema de Petshop");  

        this.setLayout(new BorderLayout());
		
		painelCentral.setLayout(new GridLayout(11,2));
		painelInferior.setLayout(new GridLayout());
		
		painelCentral.add(new JLabel ("ID do cliente: "));  
        painelCentral.add(clienteId);  // campo textfield clienteId
		
        painelCentral.add(new JLabel ("Nome do cliente: "));  
        painelCentral.add(nomeCliente);  // campo textfield nomeCliente

		painelCentral.add(new JLabel ("Rua: "));  
        painelCentral.add(ruaCliente);  // campo textfield ruaCliente

        painelCentral.add(new JLabel ("Número: "));  
        painelCentral.add(numeroCliente);  // campo textfield numeroCliente

        painelCentral.add(new JLabel ("Bairro: "));  
        painelCentral.add(bairroCliente);  // campo textfield bairroCliente
		
		painelCentral.add(new JLabel ("Cidade: "));  
        painelCentral.add(cidadeCliente);  // campo textfield cidadeCliente
		
		painelCentral.add(new JLabel ("Estado: "));  
        painelCentral.add(estadoCliente);  // campo textfield estadoCliente
		
		painelCentral.add(new JLabel ("País: "));  
        painelCentral.add(paisCliente);   // campo textfield paisCliente
		
		painelCentral.add(new JLabel ("CEP: "));  
        painelCentral.add(cepCliente);   // campo textfield cepCliente
		
		painelCentral.add(new JLabel ("Telefone: "));  
        painelCentral.add(telefoneCliente);  // campo textfield telefoneCliente
		
		painelCentral.add(new JLabel ("Email: "));  
        painelCentral.add(emailCliente);  // campo textfield emailCliente
		
		
		
        painelInferior.add(novo);// add o botão 'Novo' no JFrame
        painelInferior.add(gravar);// add o botão 'Gravar' no JFrame
		painelInferior.add(editar);// add o botão 'Editar' no JFrame
		painelInferior.add(apagar);// add o botão 'Apagar' no JFrame
		painelInferior.add(sair);// add o botão 'Sair' no JFrame

		this.add(painelCentral, BorderLayout.CENTER);
		this.add(painelInferior, BorderLayout.SOUTH);
        
        //TextFieldHandler handlerTextField = new TextFieldHandler();
		//clienteId.addActionListener(handlerTextField);
		//nomeCliente.addActionListener(handlerTextField);
		
		ButtonHandler handlerButton = new ButtonHandler();
		novo.addActionListener(handlerButton);
		gravar.addActionListener(handlerButton);
		editar.addActionListener(handlerButton);
		apagar.addActionListener(handlerButton);
		sair.addActionListener(handlerButton);
		
		setSize(800,600);
        setVisible(true);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
	}
	   /*
	    private class TextFieldHandler implements ActionListener
		{
			public void actionPerformed(ActionEvent event)
			{
				String conteudoTextField = "";
				
				// Usuário pressionou <Enter> no JTextField 'login'
				if(event.getSource() == login)
				{
					conteudoTextField = String.format("%s",event.getActionCommand());
				}
				else // Usuário pressinou <Enter> no JPasswordField 'senha'
				if (event.getSource() == senha)
				{
					conteudoTextField = String.format("%s",event.getActionCommand());
				}
				
				JOptionPane.showMessageDialog(null,conteudoTextField);
				
				
			}
		}*/
		
		private class ButtonHandler implements ActionListener
		{
			public void actionPerformed(ActionEvent event)
			{
				String botaoClicado = "";
				
                if (event.getSource() == gravar)
				JOptionPane.showMessageDialog(null,"Botao Gravar clicado. Cliente ID: " + clienteId.getText());
		        else
				if (event.getSource() == sair)
				JOptionPane.showMessageDialog(null,"Botao Sair clicado");
			    // event.getActionCommand() -> Para um evento JButton, o método getActionCommand de ActionEvent
				// retorna o rótulo no JButton
			}
		}
		

    public static void main(String[] args) {


        new Sistema();
    }




}

Obrigado.

olá, tudo bem?? Por que você não da uma olhada no meu gerenciador de layout swing? Se ainda houver interesse, segue o link: