Problemas com GridLayout

Pessoal,

Estou com problemas ao utilizar o GridLayout. Ele não ocupa toda a área do frame. (Imagem em anexo).

Abaixo o meu código;

[code]import java.awt.;
import javax.swing.
;
import java.util.*;

public class GridLayoutDemo {

private static void createAndShowGUI() {

    int linhas = 20;
    int colunas = 65;
    int espacamento = 3;

    JFrame frame = new JFrame("GridLayoutDemo");
    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

    JPanel principal = new JPanel();

    GridLayout layout = new GridLayout();
    layout.setColumns(colunas);
    layout.setRows(linhas);
    layout.setHgap(espacamento);
    layout.setVgap(espacamento);

    principal.setLayout(layout);
    principal.setBackground(Color.BLACK);

    for (int i = 0; i &lt linhas; i++) {
        for (int j = 0; j &lt colunas; j++) {
            JPanel temp = new JPanel();

            if (new Random().nextBoolean()) {
                temp.setBackground(Color.YELLOW);
            } else {
                temp.setBackground(Color.WHITE);
            }
            principal.add(temp);
        }
    }

    frame.add(principal);

    frame.setSize(640, 190);
    frame.setLocationRelativeTo(null);
    frame.setResizable(false);
    frame.setVisible(true);

    layout.layoutContainer(principal);
}

public static void main(String[] args) {
    createAndShowGUI();
}

}[/code]

Alguém tem alguma sugestão?

Aumente o numero de colunas ou entao diminua o tamanho do frame ou ainda, compacte o frame

Abaixo do frame.setVisible(true);

coloque

frame.pack();

testei aqui e funcionou, caso não dê certo avisa aí.

Roger

[quote=zetamayossi]Aumente o numero de colunas…[/quote]Independente do número de linhas e colunas, sempre sobra espaço.

[quote=zetamayossi]…entao diminua o tamanho do frame…[/quote]O problema persiste.

[quote=zetamayossi]… ou ainda, compacte o frame[/quote]Com o método pack()? Vai funcionar, só que ele redimensionará o frame (e não quero isso)

Mesmo assim, obrigado

[quote=Roger–]Abaixo do frame.setVisible(true);

coloque

frame.pack();

testei aqui e funcionou, caso não dê certo avisa aí.

Roger[/quote]Como já disse, assim funciona, só que ele vai aumentar ou diminuir o frame de maneira que todos os componentes sejam encaixados num tamanho que ele determinar. Gostaria que fosse ocupada toda a área do tamanho que eu defini (640 x 190)

em GridLayout todas as celulas tem q ter exatamente o msm tamanho…
Por consequencia disto e por vc colocar muitas colunas ele divide a largura pela quatidade de colunas e arredonda o acarreta em diminuir a celula, e como são muitas colunas esta diferença acaba sendo grande no final…

uma tentativa de solução foi o GridBagLayout q tenta ocupar tota a area com uma margem de diferença…

veja se minha implementação é o q vc queria…

[code]import java.awt.;
import javax.swing.
;
import java.util.*;

public class GridLayoutDemo {

private static void createAndShowGUI() {
	
	int linhas = 20;
	int colunas = 65;
	int espacamento = 2;
	
	JFrame frame = new JFrame("GridLayoutDemo");
	frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
	
	JPanel principal = new JPanel();
	
	GridBagConstraints c = new GridBagConstraints();
	GridBagLayout layout = new GridBagLayout();
	
	principal.setLayout(layout);
	
	principal.setBackground(Color.BLACK);
	
	for (int i = 0; i < linhas; i++) {
		for (int j = 0; j < colunas; j++) {
			JPanel temp = new JPanel();
			
			if (new Random().nextBoolean()) {
				temp.setBackground(Color.YELLOW);
			} else {
				temp.setBackground(Color.WHITE);
			}
			
			c = new GridBagConstraints();
			c.insets = new Insets(espacamento,espacamento,espacamento,espacamento);
			c.gridx = j+1;
			c.gridy = i+1;
                            //...ALTERADO...
			c.weightx = (i % 2 == 1 ? 5.0 : 4.0 );
			c.weighty = (j % 2 == 1 ? 5.0 : 4.0 );
                            //...ALTERADO...
			c.fill = GridBagConstraints.BOTH;
			principal.add(temp, c);
		}
	}
	frame.setLayout(new BorderLayout());
	frame.add(principal, BorderLayout.CENTER);
	
	frame.setSize(640, 190);
	//frame.setLocationRelativeTo(null);
	//frame.setResizable(false);
	frame.setVisible(true);
	
	//layout.layoutContainer(principal);
}

public static void main(String[] args) {
	createAndShowGUI();
}

}[/code]

1 curtida

Valeu, Flasoft. Era isso mesmo que eu queria.

Agora, não entendi o seguinte trecho:

c.weightx = (i % 2 == 1 ? 5.0 : 4.0 );
c.weighty = (j % 2 == 1 ? 5.0 : 4.0 );

Porque esses valores? Eu testei simplesmente com 1 e funcionou.

[]'s

Estes valores são um tipo de influenciador no tamanho das celula em relação ao tamanho das outras celulas.

EX:
c.weightx = 10
…trecho 1
c.weightx = 20
…trecho 2

o componente q for adicionado no trecho1 terá medade do tamanho do componente que for adicionado no trecho 2…

o que eu fiz foi dar um preferencia maior para as celulas impares…

Se não entender pergunte novamente…