GridBagLayout - Disposição dos controles

Bom dia pessoal,

Estou aprendendo a trabalhar com Layouts e achei o GridBagLayout muito interessante por ser extremamente flexível, entretanto estou tendo algumas dúvidas.

Eu gostaria de criar um Layout com a cara do código abaixo:


package Testes;

import java.awt.Container;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;

public class A80GBL extends JFrame{

public A80GBL() {

	super("Calculadora com GridBagLayout");
	
	Container c = getContentPane();
	
	GridBagLayout layout = new GridBagLayout();
	GridBagConstraints cons = new GridBagConstraints();
	
	c.setLayout(layout);
	
	cons.fill = GridBagConstraints.BOTH;
	
	cons.ipady = 10;

	cons.gridy = 0;
            cons.gridx = 0;
	cons.gridwidth = 4;
    
            c.add(new JTextField(), cons);
    
            cons.gridy = 1;
   
	cons.gridwidth = 1;
    
	cons.gridx = 1;
	c.add(new JButton(), cons);
	
	cons.gridx = 2;
	c.add(new JButton(), cons);
	
	cons.gridx = 3;
	c.add(new JButton(), cons);
    
	setVisible(true);
	setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	setSize(300, 300);
	
}

public static void main(String[] args) {
	
	new A80GBL();

}

}


No meu pensamento ao implementar o código abaixo o que deveria ser disponibilizado é:


|*********|
|
(JTextArea)
|

************************************
…espaço…
…vazio…

…--------------------------------------

Mas o que na verdade aparece na janela é:


|**********|
|
(JTextArea)
|

***************************
********
*(JButton)
********

Saberiam por favor me explicar o por quê isso acontece?

Obrigado,

DaniloWORE, cara eu fiz um negócio desse numas cadeiras passadas ai. Tem algumas diferenças na minha solução, eu tentei dar uma olhada no teu código, tentei adaptar porém não saiu com vc deseja.

Tenho uma solução pronta aqui e faz o que vc precisa, se quiser dar uma olhada eu coloco aqui, e vc v uma melhor solução para vc.

[quote=urbgames]DaniloWORE, cara eu fiz um negócio desse numas cadeiras passadas ai. Tem algumas diferenças na minha solução, eu tentei dar uma olhada no teu código, tentei adaptar porém não saiu com vc deseja.

Tenho uma solução pronta aqui e faz o que vc precisa, se quiser dar uma olhada eu coloco aqui, e vc v uma melhor solução para vc.[/quote]

Urb, por favor cara gostaria de dar uma olhada na sua solução sim. Se puder postar agradeço.

DaniloWORE tá ai o código q por sinal é projeto de uma calculadora.

[code]package calculadora;

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Component;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;

public class Botao extends JFrame{

private GridBagLayout layout;
private GridBagConstraints restricoes;

String tela = "";

JButton botao0 = new JButton("0");
JButton botao1 = new JButton("1");
JButton botao2 = new JButton("2");
JButton botao3 = new JButton("3");
JButton botao4 = new JButton("4");
JButton botao5 = new JButton("5");
JButton botao6 = new JButton("6");
JButton botao7 = new JButton("7");
JButton botao8 = new JButton("8");
JButton botao9 = new JButton("9");
JButton botao10 = new JButton("+");
JButton botao11 = new JButton(".");
JButton botao12 = new JButton("-");
JButton botao13 = new JButton("=");
JButton botao14 = new JButton("/");
JButton botao15 = new JButton("*");
JButton botao16 = new JButton("%");
JButton botao17 = new JButton("√");

JTextField texto = new JTextField("0");

public Botao(){
	super ("Calculadora");
	
	layout = new GridBagLayout();
	setLayout(layout);
	restricoes = new GridBagConstraints();
	
	restricoes.fill = GridBagConstraints.BOTH;
	
	addComponent(texto, 0, 0, 5, 1);
	addComponent(botao0, 5, 0, 2, 1);
	addComponent(botao1, 4, 0, 1, 1);
	addComponent(botao2, 4, 1, 1, 1);
	addComponent(botao3, 4, 2, 1, 1);
	addComponent(botao4, 3, 0, 1, 1);
	addComponent(botao5, 3, 1, 1, 1);
	addComponent(botao6, 3, 2, 1, 1);
	addComponent(botao7, 2, 0, 1, 1);
	addComponent(botao8, 2, 1, 1, 1);
	addComponent(botao9, 2, 2, 1, 1);
	addComponent(botao10, 5, 3, 1, 1);
	addComponent(botao11, 5, 2, 1, 1);
	addComponent(botao12, 4, 3, 1, 1);
	addComponent(botao13, 4, 4, 1, 2);
	addComponent(botao14, 2, 3, 1, 1);
	addComponent(botao15, 3, 3, 1, 1);
	addComponent(botao16, 2, 4, 1, 1);
	addComponent(botao17, 3, 4, 1, 1);
	
	
	}
	
private void addComponent(Component componente, int linha, int coluna, int largura, int altura){
	restricoes.gridx = coluna;
	restricoes.gridy = linha;
	restricoes.gridwidth = largura;
	restricoes.gridheight = altura;
	layout.setConstraints(componente, restricoes);
	add(componente);
}

}

[/code]

Eu iria de MigLayout, hein?
Bem mais flexível e intuitivo que o GridBagLayout. Além do mais, você pode trabalhar com porcentagens, que é um lance bacana no Java Swing, podendo também diminuir suas linhas de código, tendo uma produtividade maior.
Faça um teste, vale muito a experiência.

Fique com Deus! :smiley:

+1

A propósito, mesmo usando uma ferramenta para achar os “constraints” do GridBagLayout, ainda digo que é necessário ver este vídeo antes para decidir se você quer realmente usar o GridBagLayout:

http://madbean.com/anim/totallygridbag