Gerenciador de layout GridBagLayout[RESOLVIDO]

Olá pessoal! Estou montando um aplicativo estou usando o GridBagLayout para uma melhor aparência da GUI. Só que ai tem um problema: o JFrame com o GridBagLayout possui dois JPanel um principal que aparece normalmente, e outro que por possui, por wnquanto, dois JLabels que não aparecem independente do gerenciador de layout que eu aplique neste JPanel. Agora quando eu altero o gerenciador de layout do JFrame para, por exemplo, GridLayout os JLabel aparecem normalmente. Alguem ai tem alguma idéia do que pode ser isto?

veja isso: http://javafree.uol.com.br/artigo/5792/Tudo-sobre-o-GridBagLayout.html

t+ e boa sorte

[quote=fernandopaiva]veja isso: http://javafree.uol.com.br/artigo/5792/Tudo-sobre-o-GridBagLayout.html

t+ e boa sorte[/quote]

Acabei de ler o artigo e boa parte do que ele fala eu usei. O que eu quero saber é qual a influência que o gerenciador de layout do JFrame tem sobre o JPanel secudario?

O GridBagLayout não costuma sumir com componentes. Só com as informações passadas é meio difícil dizer, mas pode ser que alguma configuração esteja fazendo os painéis ficarem sobrepostos, escondendo o que fica por baixo. Como você está adicionando os painéis ao JFrame?

Os JPanels não estão sobrepostos eu ja configurei GridLayout para o segundo JPanel mas nada aparece nele. Só apareceu quando eu alterei de GridBagLayout par GridLayout o gereciador de leyout do JFrame.

Então sugiro que poste o código que usou pra adicionar os paineis ao JFrame. Assim o pessoal pode te ajudar melhor.

Ai vai o codigo. É um jogo de tetris que eu ja consgui fazer e agora estou aperfeiçoando.

package com.tetris.view;

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

import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class GUI extends JFrame{
	
	private JPanel mainpanel;
	private InfoPanel infpanel;
	private Grid grid1;
	private GridBagLayout layout;
	private GridBagConstraints constraints;
	
	public GUI(){
		super("Tetris");
		layout = new GridBagLayout();
		constraints = new GridBagConstraints();
		setLayout(layout);
		
		grid1 = new Grid(30, 10);
		mainpanel = new JPanel(new GridLayout(1,3));
		infpanel = new InfoPanel();
		mainpanel.setBorder(BorderFactory.createEtchedBorder());
		infpanel.setBorder(BorderFactory.createEtchedBorder());
		mainpanel.add(grid1);
		
		constraints.insets = new Insets(10, 10, 10, 10);
		constraints.fill = GridBagConstraints.BOTH;
		constraints.weightx = 1;
		constraints.weighty = 1;
		addComponent(mainpanel, 1, 1, 10, 30);
		addComponent(infpanel, 1, 10, 5, 30);
		
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setSize(630, 630);
		setVisible(true);
	}// fim do construtor
	
	public void addComponent(Component component,
		int row, int column, int width, int height){
		constraints.gridx = column;
		constraints.gridy = row;
		constraints.gridwidth = width;
		constraints.gridheight = height;
		layout.setConstraints(component, constraints);
		getContentPane().add(component);
	}// fim do metodo addComponent
	
}// fim da classe GUI


package com.tetris.view;

import java.awt.GridLayout;

import javax.swing.JLabel;
import javax.swing.JPanel;

public class InfoPanel extends JPanel{
	private int score, level;
	private JLabel labelScore, labelLevel;
	
	public InfoPanel(){
		setLayout(new GridLayout(1, 2));
		labelScore = new JLabel(""+getScore());
		labelLevel = new JLabel(""+getLevel());
		labelScore.setBounds(300, 5, 100, 20);
		labelLevel.setBounds(300, 30, 100, 20);
		add(labelScore);
		add(labelLevel);
	}// fim do construtor

	public int getScore() {
		return score;
	}

	public void setScore(int score) {
		this.score = score;
	}

	public int getLevel() {
		return level;
	}

	public void setLevel(int level) {
		this.level = level;
	}
}// fim da classe infoPanel


package com.tetris.view;

import java.awt.Color;
import java.awt.GridLayout;

import javax.swing.BorderFactory;
import javax.swing.JPanel;

public class Grid extends JPanel{
	private final int ROWS;
	private final int COLS;
	private JPanel cell;
	private JPanel[][] group;

	public Grid(int rows, int cols){
		ROWS = rows;
		COLS = cols;
		setLayout(new GridLayout(ROWS, COLS));
		
		group = new JPanel[ROWS][COLS];
		for(int i = 0; i < ROWS; i++)
			for(int j = 0; j < COLS; j++){
				cell = new JPanel();
				cell.setBorder(BorderFactory.createEtchedBorder());
				group[i][j] = cell;
				add(cell);
			}// fim do for
	}// fim do construtor
	
	public void setCellColor(int x, int y, Color color){
		group[y-1][x-1].setBackground(color);
	}
}// fim da classe Grid

O problema está na configuração do GridBagConstraints, neste trecho:

addComponent(mainpanel, 1, 1, 10, 30); // diz que mainpanel ocupará da célula 1 até a célula 10 addComponent(infpanel, 1, 10, 5, 30); // diz que infpanel comecará na célula 10, que já está ocupada por mainpanel
Então para resolver o problema é preciso rearranjar os parâmetros passados para as constraints. Uma forma de evitar que componentes ocupem a mesma célula sem querer, é usar constraints preestabelecidas como RELATIVE, que coloca o componente após o último que foi adicionado.

Outra coisa, na classe InfoPanel, você está setando o layout como GridLayout, então aquela chamada ao setBounds está sobrando no código, deixe que o layout manager se encarregue disto.

[quote=Eric Yuzo]O problema está na configuração do GridBagConstraints, neste trecho:

addComponent(mainpanel, 1, 1, 10, 30); // diz que mainpanel ocupará da célula 1 até a célula 10 addComponent(infpanel, 1, 10, 5, 30); // diz que infpanel comecará na célula 10, que já está ocupada por mainpanel
Então para resolver o problema é preciso rearranjar os parâmetros passados para as constraints. Uma forma de evitar que componentes ocupem a mesma célula sem querer, é usar constraints preestabelecidas como RELATIVE, que coloca o componente após o último que foi adicionado.

Outra coisa, na classe InfoPanel, você está setando o layout como GridLayout, então aquela chamada ao setBounds está sobrando no código, deixe que o layout manager se encarregue disto.[/quote]

Valeu Eric, uma coisa tão simples e eu nem percebi.