GridBagLayout não ocupa todo o frame

5 respostas
A

Olá

Estou desenvolvendo um GUI usando GridBagLayout.

Consigo posicionar os elementos onde quero, mas tenho um JFrame com 800 x 600, mas os elementos que adiciono a ele ocupam apenas uma região central do mesmo.

Tentei uma aplicação mais simples com apenas um JLabel contendo um Icon. Tentei posicionar o label no canto superior esquerdo, mas só aparece mais ou menos na porção central do JFrame.

Como faço para fazer os componentes ocuparem toda a extensão do JFrame principal?

segue o código, com o Icon:

public MainJFrame() {
		super("Gui");

		layout = new GridBagLayout();
		constraints = new GridBagConstraints();
	
		setLayout(layout);
		
		Icon logo = new ImageIcon(getClass().getResource("logo.png"));
		JLabel labelLogo = new JLabel();
		labelLogo.setIcon(logo);
		
		constraints.fill = GridBagConstraints.BOTH;
		constraints.gridx = 0;
		constraints.gridy = 0;
		constraints.gridwidth = 1;
		constraints.gridheight = 1;
		layout.setConstraints(labelLogo, constraints);
		add(labelLogo);
		
	}

código que instancia MainJFrame:

MainJFrame frame = new MainJFrame();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setSize(800, 600);
		frame.setVisible(true);

Obrigado

5 Respostas

von.juliano

Cara, na verdade esse layout posiciona os elementos no frame em grade, mas de acordo com o número de elementos adicionados. Adicionando só um componente ele só vai ficar posicionado no meio mesmo, independente do valor setado no seu GridBagConstraints.

Nesse caso, pq vc não tenta utilizar o GridLayout?

ViniGodoy

Por default, ele vai colocar os componentes no meio mesmo.

Um xunxo útil é criar “stretch panels”. Ou seja, você põe um painel vazio na parte de baixo, que ocupe todas as linhas, e manda ele põe ele com peso (weight) em y igual a 1 (assim ele vai se “esticar” e ocupar toda a parte de baixo, empurrando seus componentes para cima).

Se precisar empurrar os componentes para a direita, faça a mesma cosia. Crie um “stretch” panel na última coluna, que ocupe todas as linhas. Então, coloque o peso desse painel em x igual a 1.

Essa técnica é fácil e mais confiável do que definir padding, uma vez que o painel se ajustará dinamicamente a sua tela.

A

von.juliano:
Cara, na verdade esse layout posiciona os elementos no frame em grade, mas de acordo com o número de elementos adicionados. Adicionando só um componente ele só vai ficar posicionado no meio mesmo, independente do valor setado no seu GridBagConstraints.

Nesse caso, pq vc não tenta utilizar o GridLayout?

Estou usando o GridBagLayout porque tem outros elementos na interface que tem tamanhos diferentes, a sabel um Panel contendo alguns labels e dois objetos JFreeChart.

Imaginei que precisasse colocar todos os elementos, mas mesmo assim, eles ocupam apenas o centro da tela.

A

ViniGodoy:
Por default, ele vai colocar os componentes no meio mesmo.

Um xunxo útil é criar “stretch panels”. Ou seja, você põe um painel vazio na parte de baixo, que ocupe todas as linhas, e manda ele põe ele com peso (weight) em y igual a 1 (assim ele vai se “esticar” e ocupar toda a parte de baixo, empurrando seus componentes para cima).

Se precisar empurrar os componentes para a direita, faça a mesma cosia. Crie um “stretch” panel na última coluna, que ocupe todas as linhas. Então, coloque o peso desse painel em x igual a 1.

Essa técnica é fácil e mais confiável do que definir padding, uma vez que o painel se ajustará dinamicamente a sua tela.

Só para eu ver se entendi direito. É só criar um JPanel normal e definir peso em x e y?

Como seria a alternativa de “definir padding” que você cita?

ViniGodoy

Isso, põe um painel na parte de baixo, a manda ele esticar em y (peso=1, fill em BOTH).
Põe outro na direita e manda ele esticar em x (peso=1, fill em BOTH).

Os paineis crescem e “empurram” todo o conteúdo para o canto (nesse caso o superior esquerdo).

Criado 19 de janeiro de 2007
Ultima resposta 22 de jan. de 2007
Respostas 5
Participantes 3