Problemas com GridLayout

7 respostas
M

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;

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();
    }
}

Alguém tem alguma sugestão?

7 Respostas

Z

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

R

Abaixo do frame.setVisible(true);

coloque

frame.pack();

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

Roger

M

zetamayossi:
Aumente o numero de colunas…
Independente do número de linhas e colunas, sempre sobra espaço.

zetamayossi:
…entao diminua o tamanho do frame…
O problema persiste.

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

Mesmo assim, obrigado

M

Roger–:
Abaixo do frame.setVisible(true);

coloque

frame.pack();

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

Roger

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)

F

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

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();
	}
}
M

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

F

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…

Criado 22 de dezembro de 2006
Ultima resposta 3 de jan. de 2007
Respostas 7
Participantes 4