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?
[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.