Dúvidas com o Layout Manager Mig Layout

4 respostas
E

E ai moçada, beleza? Em quase todos os fóruns que visito as pessoas recomendam o MigLayout para criação de GUI… Eu comecei a estudar o Mig Layout e surgiu uma dúvida em relação a alinhamentos dos componentes, mais precisamente o tamanho dos Text Field. Alguém pode dar uma dica de como deixa-los alinhados?

Abaixo segue o código que utilizei para a criação da GUI e ScreenShot dela. Pra entender o que eu estou querendo dizer, basta olhar para o textfield referente a Fax e o referente a Email… Ambos estão desalinhados.

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import javax.swing.text.MaskFormatter;
import net.miginfocom.swing.MigLayout;

public class GuiAgenda extends JFrame
{
	JLabel lcodigo = new JLabel ("Codigo");
	JTextField tfCodigo = new JTextField (3);
	JLabel lnome = new JLabel ("Nome");	
	JTextField tfnome = new JTextField (25);
	MigLayout MigLayout = new MigLayout ();
	JPanel panel = new JPanel ();
	JButton b_teste = new JButton ("Teste");
	String nomes [] = {"CE", "PA", "RJ"};
	JLabel lendereco = new JLabel ("Endereço");
	JTextField tfendereco = new JTextField (30);
	JLabel lnumero = new JLabel ("Nº");
	JTextField tfnumero = new JTextField (3);
	JLabel lcidade = new JLabel ("Cidade");
	String sexos [] = {"Masculino", "Feminino"};
	JLabel lsexo = new JLabel ("Sexo");
	JComboBox sexobox = new JComboBox (sexos);
	JTextField tfcidade = new JTextField (15);
	JLabel lestado = new JLabel ("Estado");
	JComboBox combobox = new JComboBox (nomes);
	JLabel lTelefone = new JLabel ("Telefone");
	JFormattedTextField tfTelefone = new JFormattedTextField (Mascara("(##)####-####"));
	JLabel lFax = new JLabel ("FAX");
	JFormattedTextField tfFax = new JFormattedTextField (Mascara("(##)####-####"));
	JLabel lemail = new JLabel ("E-mail");
	JTextField tfEmail = new JTextField (19);	
	JButton bNovo = new JButton ("Novo");
	JButton bSalvar = new JButton ("Salvar");
	JButton bLocalizar = new JButton ("Localizar");
	JButton bDeletar = new JButton ("Deletar");
	JButton bSair = new JButton ("Sair");
	JPanel panel2 = new JPanel ();
	
	public GuiAgenda ()
	{	
		super ("Agenda");
		super.setDefaultCloseOperation(EXIT_ON_CLOSE);
		super.setVisible(true);
		super.setLocationRelativeTo(null);
		super.setLayout(new BorderLayout());
		super.setResizable (false);
		super.setSize (475,220);
		
		panel.setLayout(MigLayout);
		panel2.setLayout(new FlowLayout());
		
		tfTelefone.setPreferredSize(new Dimension(90,25));
		tfFax.setPreferredSize(new Dimension(90,25));
		
		panel.add(lcodigo);
		panel.add(tfCodigo,"wrap");
		panel.add(lnome);
		panel.add(tfnome,"wrap");
		panel.add(lendereco);
		panel.add(tfendereco,"split");
		panel.add(lnumero);
		panel.add(tfnumero, "wrap, span, split");
		panel.add(lsexo);
		panel.add(sexobox,"split");
		panel.add(lcidade);
		panel.add(tfcidade,"split");
		panel.add(lestado);
		panel.add(combobox,"wrap, span");
		panel.add(lTelefone);
		panel.add(tfTelefone, "split");
		panel.add(lFax);
		panel.add(tfFax,"wrap");
		panel.add(lemail);
		panel.add(tfEmail);
		
		panel2.add(bNovo);
		panel2.add(bSalvar);
		panel2.add(bDeletar);
		panel2.add(bLocalizar);
		panel2.add(bSair);
		
		super.add(panel,BorderLayout.CENTER);
		super.add(panel2,BorderLayout.SOUTH);
		
		bSair.addActionListener(new BotaoAcao
				());		
	}
	
	public MaskFormatter Mascara(String Mascara){  
        
	       MaskFormatter F_Mascara = new MaskFormatter();  
	       try{  
	           F_Mascara.setMask(Mascara); //Atribui a mascara  
	           F_Mascara.setPlaceholder(" "); //Caracter para preencimento
	           
	       }  
	       catch (Exception excecao) {  
	       excecao.printStackTrace();  
	       }   
	       return F_Mascara;  
	}
	
	private class BotaoAcao implements ActionListener
	{
		public void actionPerformed (ActionEvent event)
		{
			if (event.getSource() == bSair)
			{
				System.exit(0);
			}
		}
	}
	
}

P.s.: Vale ressaltar que ainda sou novato em programação Java, e agradeceria bastante alguém me dar uma luz. Valeu! =D

4 Respostas

Nicolas_Fernandes

Oi, amigo.
Vê se esse código resolve seu problema.
Você pode fazer uso da propriedade growx para que o componente cresça até o limite do layout.
A partir dai, você usa split pra controlar o número de campos por linha, e os outros parâmetros que você tá acostumado!

public GuiAgenda() {

        try {
            UIManager.setLookAndFeel(
            UIManager.getSystemLookAndFeelClassName());
        }
        catch (Exception anyError) {
            anyError.printStackTrace();
        }
        
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLayout(new BorderLayout());
        setLocationRelativeTo(null);
        setResizable(false);
        setTitle("Agenda");
        setSize(500, 290);
        setVisible(true);

        panel.setLayout(new MigLayout());
        panel.setBorder(BorderFactory.createTitledBorder(
        BorderFactory.createLineBorder(Color.gray), "Dados do contato"));
        panel2.setLayout(new MigLayout("", "push[][][][][]push"));

        
        tfTelefone.setPreferredSize(new Dimension(90, 25));
        tfFax.setPreferredSize(new Dimension(90, 25));

        panel.add(lcodigo, "align right");
        panel.add(tfCodigo, "growx, wrap");
        panel.add(lnome, "align right");
        panel.add(tfnome, "growx, wrap");
        panel.add(lendereco, "align right");
        panel.add(tfendereco, "gap right 2, split");
        panel.add(lnumero, "align right");
        panel.add(tfnumero, "growx, wrap");
        panel.add(lsexo, "align right");
        panel.add(sexobox, "growx, split");
        panel.add(lcidade, "align right");
        panel.add(tfcidade, "growx, split");
        panel.add(lestado, "align right");
        panel.add(combobox, "growx, wrap");

        panel.add(lemail, "align right");
        panel.add(tfEmail, "growx, wrap");

        panel.add(lTelefone, "align right");
        panel.add(tfTelefone, "wrap");
        panel.add(lFax, "align right");
        panel.add(tfFax, "");

        panel2.add(bNovo);
        panel2.add(bSalvar);
        panel2.add(bDeletar);
        panel2.add(bLocalizar);
        panel2.add(bSair);

        add(panel, BorderLayout.NORTH);
        add(panel2, BorderLayout.CENTER);

Espero ter ajudado!
Fica com Deus, abração!

E

Nussa… Valeu a força… Pensei que ninguem ia ajudar. ehehe
Mas em relação a GUI, o campo código e email ficou do tamanho do Frame, acho que é muito grande. eheh Mas de toda forma, com a sua ajuda deu uma clareada e agora ficará mais fácil… Valeu Nicolas.

Nicolas_Fernandes

Erehbr:
Nussa… Valeu a força… Pensei que ninguem ia ajudar. ehehe
Mas em relação a GUI, o campo código e email ficou do tamanho do Frame, acho que é muito grande. eheh Mas de toda forma, com a sua ajuda deu uma clareada e agora ficará mais fácil… Valeu Nicolas.

Que isso, Erehbr. Estamos aí pra isso. ^^
Sim, ele ficou do tamanho do frame. A propriedade growx vai estender o componente até o tamanho máximo permitido a ele.
Agora, você pode colocar esse formulário dentro de um JPanel e setar o tamanho desse JPanel. Daí os seus componentes mudarão de acordo com o JPanel. Que acha da ideia?

Fica com Deus, bons estudos. Abraço!

E

Hmm… Beleza!! ^^

Assim que eu tiver um tempinho livre aqui no escritório eu faço como você ensinou… É dureza, estudar e trabalhar é tenso, tenho que aproveitar cada segundo livre. hehehe

Nicolas, eu ando fazendo os formulários “na unha”, acho muito sujo o código feito com os editores… O que você sugere amigão? Desisto de fazer na unha e passo a usar um editor?
E novamente muito obrigado pelas dicas.

Criado 4 de janeiro de 2012
Ultima resposta 5 de jan. de 2012
Respostas 4
Participantes 2