Gerenciador de Layout

12 respostas
W

tipo, eu ja projeto layouts em HTML a mto tempo, la eu consigo monta praticamente de td... mas no java eu to apanhando feio...

tipo, meu layout tem 3 componentes (2 textarea e 1 button)

eu quero algo simples, 1 textarea fica em cima, e preenche todo o espaco restante, a outra textarea e o botao ficam em baixo, ao lado um do outro, o botao com altura e largura definida, a 2 textarea tem altura definida, mas n largura... nada melhor q um desenho neh:

[img]http://www.uniguararapes.com.br/wilker/desenho.gif[/img]

aproveitando, vo escreve como eu faria isso + - em HTML:

<table width=100% height=100%>
<tr>
<td colspan=2>
textarea1 aki
</td>
</tr>
<tr>
<td height=60>
textarea2 aki
</td>
<td>
botao aki
</td>
</tr></table>

por swing eu tentei dessa maneira(to postando apenas a parte do codigo q interessa):

gbc.fill = GridBagConstraints.BOTH;
        gbc.weightx = 1;
        gbc.weighty = 1;
        gbc.gridwidth = 2;
        addComp(c, new JScrollPane(conversa), gbc, 0, 0);
        
        gbc.fill = GridBagConstraints.HORIZONTAL;
        gbc.weightx = 1;
        gbc.weighty = 0;
        gbc.gridwidth = 1;
        addComp(c, new JScrollPane(redigir), gbc, 0, 1);
        
        gbc.fill = GridBagConstraints.BOTH;
        gbc.weightx = 0;
        addComp(c, enviar, gbc, 1, 1);
    
    public void addComp(Container cont, Component c, GridBagConstraints gbc, int px, int py) {
    	gbc.gridx = px;
    	gbc.gridy = py;
    	cont.add(c, gbc);
    }

esse ai quase funciona... o problema eh q qdo a textarea de cima chega ao ponto da barra de rolagem mexer, qdo eu do um resize na tela a textarea de baxo simplesmente encolhe...

12 Respostas

_fs

Cara, como descobri recentemente, Swing sem Forms gera queda de cabelos, unhas roídas e úlcera.

Minha sugestão: desiste do GridBagLayoutFromHell, e baixe este arquivo
http://www.jgoodies.com/download/libraries/forms-1_0_5.zip
e leia este tutorial (se não abrir na primeira, atualize a página)
http://www.jgoodies.com/articles/forms.pdf

W

LIPE:
Cara, como descobri recentemente, Swing sem Forms gera queda de cabelos, unhas roídas e úlcera.

Minha sugestão: desiste do GridBagLayoutFromHell, e baixe este arquivo
http://www.jgoodies.com/download/libraries/forms-1_0_5.zip
e leia este tutorial (se não abrir na primeira, atualize a página)
http://www.jgoodies.com/articles/forms.pdf

mto boa lipe, esse treco ai realmente eh bom e funciona :D:D

recomendo a todos

W

lipe… o pior eh q eu refiz o layout com o form… e kra… deu na merma :frowning:

eh o seguinte, eu sinto q a jtextarea de cima esta ignorando a barra de rolangem… toda vez q a janela eh redimensionada ele cresce o sulficiente pra exibir todo o conteudo da jtextarea, ai fica sem barra de rolagem, e os outros componentes somem…

vc sabe com resolve?

_fs

Posta o código, por favor.

W

ta ai:

CellConstraints cc = new CellConstraints();
        FormLayout layout = new FormLayout("5px, f:p:g, 5px, f:100px, 5px", "5px, f:p:g, 5px, f:60px, 5px");
        JPanel panel = new JPanel(layout);
        
        Container c = getContentPane();
        
        conversa = new JTextArea();
        conversa.setEditable(false);
        conversa.setFocusable(false);
        conversa.setLineWrap(true);
        
        redigir = new JTextArea();

        enviar = new JButton("Enviar");
        
        JScrollPane pc = new JScrollPane(conversa);
        pc.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
        pc.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        
        panel.add(pc, cc.xyw(2, 2, 3));
        panel.add(new JScrollPane(redigir), cc.xy(2, 4));
        panel.add(enviar, cc.xy(4, 4));
        
        c.add(panel, "Center");
W

ajuda ae plzzzzz

_fs

Opa.

Aqui os outros componentes não somem como você falou. O objeto ‘conversa’ se redimensiona junto com a janela, ocupando todo o espaço que sobra, mas não sobrepõe a outra textarea nem o botão.

W

LIPE:
Opa.

Aqui os outros componentes não somem como você falou. O objeto ‘conversa’ se redimensiona junto com a janela, ocupando todo o espaço que sobra, mas não sobrepõe a outra textarea nem o botão.

esse eh o problema mermo, ele cresce d+, n eh q ele sobreponha, mas ele ocupa tanto espaco q os outros somem… vc n conseguiu arruma um geito dele n crescer tanto???

J2Alex

Cara, tem um programa legal pra lidar com Forms

https://abeille.dev.java.net/

Espero que ajude

_fs

O que quer dizer com “não crescer tanto”? Tamanho absoluto? Aqui não fez os outros sumirem.

Observe:

FormLayout layout = new FormLayout( "5px, f:p:g, 5px, f:100px, 5px",
				"5px, f:p:g, 5px, f:60px, 5px" );

Você declarou que qualquer elemento colocado na linha 2 (a da textarea) deve preencher todo o espaço possível, e os elementos na linha 4 (botão e a outra textarea) devem ter tamanho de 60px.

Eu lembro de ler na documentação que é possível declarar o a constraint “grow” com um double como parâmetro ( grow(0.5) ), mas não me lembro bem como funciona isso, portanto, releia esta parte :smiley:

rodrigo.achilles

Olá Wilker,

Bom não sei se é isso que vc deseja, mais acho que pode ajudar alguma coisa.

import java.awt.*;
import javax.swing.*;
/*
 * Created on 15/04/2005
 *
 * TODO To change the template for this generated file go to
 * Window - Preferences - Java - Code Style - Code Templates
 */

/**
 * @author Rodrgo Achilles Pereira
 *
 * TODO To change the template for this generated type comment go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
public class TesteLayout extends JFrame
{
	private Container cont = new Container();
	private JPanel painelSul, painelBotao, painelText;
	private JButton botaoEnviar;
	private JTextArea Area;
	private JTextField text;
	private JScrollPane barraRolagem;
	
	public TesteLayout()
	{
		super("Layuot de um CHAT");
		cont = getContentPane();
		
		cont.setLayout(new GridLayout(2, 1));
		painelSul = new JPanel();
		painelSul.setLayout(new GridLayout(1, 2));
		painelBotao = new JPanel();
		painelBotao.setLayout(new FlowLayout(FlowLayout.CENTER));
		painelText = new JPanel();
		painelText.setLayout(new FlowLayout(FlowLayout.CENTER));
		
		Area = new JTextArea(10, 20);
    	barraRolagem = new JScrollPane(Area);
    	barraRolagem.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
    	barraRolagem.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
    	text = new JTextField(20);
    	botaoEnviar = new JButton("Enviar");
    	botaoEnviar.setBorderPainted(false);
    	botaoEnviar.setContentAreaFilled(false);
    	
    	painelBotao.add(botaoEnviar);
    	painelText.add(text);
    	painelSul.add(painelText);
    	painelSul.add(painelBotao);
    	cont.add(barraRolagem);
    	cont.add(painelSul);
		
    	setContentPane(cont);
		pack();
		setVisible(true);
		setSize(490, 300);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
	public static void main(String[] args)
	{
		new TesteLayout();
	}
}

Tente usar sempre que puder, ou não, o GRIDLAYOUT, FLOWLAYOUT, BORDERLAYOUT, pois vc, em diversos so, ou resoluções, o seu trabalho será visualizado. A menos que vc fixe a janela...

Espero que tenha ajudado e desculpe se fui um pouco intrometido.
Abraçosss

W

vlw pela dica, mas eu consegui resolver!! (ufa)

bom galera, pra quem tiver com o mesmo problema, a mudanca foi na hora de criar o FormLayout

onde eu colocava f:p:g (fill:preferer:grow) eu agora coloco f:d:g (fill:default:grow)

com isso n aconteceu + o problema :smiley:

Criado 13 de abril de 2005
Ultima resposta 15 de abr. de 2005
Respostas 12
Participantes 4