Tamanho da JInternalFrame/JPanel[RESOLVIDO]

Na minha tela de detalhes(JInternalFrame), tenho um JPanel no CENTER(usando BorderLayout)
Entao colocao varios campos nela para mostrar o detalhes de um cadastro de cliente
mas fazendo um teste mais extremo, colocando varios detalhes estou tendo um problema para aparecer tudo direitinho…tentei usar um JScroll Pane mas o layout dele n consegui fazer oq que quero
Quero um Layout que adicione, como o Flow Layout (usando LEFT) e que quando não caiba mais nada pule a linha…se chegar no fnal da linha ele coloca um scroll…mas o JScrollPane Layout n faz isso
entao n sei oq fazer…nem com o MigLayout n consegui.

Segue o codigo:

[code]public class TelaDeDetalhes extends JInternalFrame implements ActionListener
{
private JPanel menuLateral;
private String imagemMenuLateral;
private JPanel painelPrincipal;
private JPanel painelDeInfos;

public TelaDeDetalhes(String titulo, String caminhoImagem)
{
    super(titulo, true, true, true, true);
    if(!caminhoImagem.equals(""))
        this.imagemMenuLateral = caminhoImagem;
    this.setSize(700, 300);
    this.setDefaultCloseOperation(JInternalFrame.DISPOSE_ON_CLOSE);
    this.construirMenuLateral();
    this.construirPainelPrincipal();
}

public TelaDeDetalhes(String titulo)
{
    this(titulo, "");
}

public void construirMenuLateral()
{
    this.menuLateral = new JPanel();
    this.menuLateral.setLayout(new BoxLayout(menuLateral, BoxLayout.Y_AXIS));
    if(this.imagemMenuLateral != null)
    {
        URL caminho = getClass().getResource(this.imagemMenuLateral);
        ImageIcon icone = new ImageIcon(caminho, "");
        JLabel imagem = new JLabel(icone);
        imagem.setBorder(BorderFactory.createEmptyBorder(5, 10, 10, 10));
        this.menuLateral.add(imagem);
    }
    JButton botaoFechar = this.criaBotaoDeMenu("Fechar");
    botaoFechar.addActionListener(this);
    this.getMenuLateral().add(botaoFechar);
    this.add(menuLateral, BorderLayout.EAST);
}

private JButton criaBotaoDeMenu(String nome)
{
    JButton botao = new JButton(nome);
    botao.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
    Dimension d = new Dimension(80, 30);
    botao.setMaximumSize(d);
    botao.setPreferredSize(d);
    botao.setSize(d);
    botao.setMaximumSize(d);
    return botao;
}

public void actionPerformed(ActionEvent e)
{
    this.dispose();
}

/**
 * @return the menuLateral
 */
public JPanel getMenuLateral()
{
    return menuLateral;
}

private void construirPainelPrincipal()
{
    this.painelPrincipal = new JPanel();
    this.painelDeInfos = new JPanel();
    this.painelPrincipal.setLayout(new BorderLayout());
    this.add(this.painelPrincipal, BorderLayout.CENTER);
    JLabel l = new JLabel("Detalhes");
    l.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
    l.setFont(new Font("Times New Roman", Font.BOLD+Font.ITALIC, 14));
    this.painelPrincipal.add(l, BorderLayout.NORTH);
    JScrollPane barraDeRolagem = new JScrollPane(painelDeInfos);
    barraDeRolagem.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
    this.painelPrincipal.add(BorderLayout.CENTER, barraDeRolagem);
    this.painelDeInfos.setLayout(new FlowLayout(FlowLayout.LEFT));
}

public void adicionarInfo(String nome, Object info)
{
    JPanel p = new JPanel();
    p.setLayout(new MigLayout("","[right][left]"));
    p.add(new JLabel(nome+":"));
    p.add(new JTextField(info.toString()));
    this.painelDeInfos.add(p);
}

}[/code]

dai uso varios
teladedetalhes.adicionarInfo(“ALGO”, “ALGO”);

dai ele n pula linha quando chega no final do JPanel…e n da pra ver

como disse com o Flow Layout ficou muito bom, mas quando ele passa o tamanho do JPanel pra baixo ele n aparece os campos…

fica assim ó:

Para isso você deveria usar o GridBagLayout (se eu não estiver enganado), ele cria células como o excel e você pode controlar os objetos dentro dele.

Um outra forma é uma combinação com vário JPanel com GridLayout, BorderLayout e FlowLayout.

tutorial da Sun

http://java.sun.com/docs/books/tutorial/uiswing/layout/using.html

É mais simples que você imagina: você cria um JPanel, usando FlowLayout normalmente. Mas ao invés de adicionar diretamente à sua janela, adicione a um JScrollPane e adicione o JScrollPane à janela. Entendeu?

É como nosso amigo ai falow mesmo… não tem como aparecer a barra de rolagem sem um scrollpanel… o JPanel não tem essa funcionalidade… então… sua hierarquia de componentes fica JPanel->JScrollPanel->Formulário… Abraço

sim, foi o que fiz
mas o JScrollPane não “quebra a linha” como o flow layout quando se chega no limite Horizontal do mesmo…olha a screenshot

aqui esta o codigo:

private void construirPainelPrincipal() { //this.painelPrincipal = new JPanel(); this.painelDeInfos = new JPanel(); //this.painelPrincipal.setLayout(new BorderLayout()); //this.add(this.painelPrincipal, BorderLayout.CENTER); JLabel l = new JLabel("Detalhes"); l.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); l.setFont(new Font("Times New Roman", Font.BOLD+Font.ITALIC, 14)); this.add(l, BorderLayout.NORTH); JScrollPane barraDeRolagem = new JScrollPane(painelDeInfos); barraDeRolagem.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); this.add(BorderLayout.CENTER, barraDeRolagem); this.painelDeInfos.setLayout(new FlowLayout(FlowLayout.LEFT)); }

Vamos esclarecer algumas coisas:

  1. O JScrollPanel realmente não faz nenhuma “quebra de linha” mesmo. Sua função é adicionar barras de rolagem conforme necessário. E nada mais.

  2. Você quer fazer isso citado acima, ou você quer dividir as informações em 2 “linhas”?

  3. Para usar o JScrollPane, o procedimento é o seguinte:
    3.1. A sua janela (JFrame, ou JDialog) tem um ‘content pane’, onde serão exibidos os componentes. Esse content pane tem o leiaute padrão como sendo BorderLayout. [b]Os únicos componentes que você adicionará à janela são o JLabel - “Detalhes” - (na posição SOUTH de BorderLayout) e o JScrollPane (na posição CENTER, a padrão do BorderLayout).
    3.2. Dentro de seu JScrollPane ficará um JPanel, contendo o formulário. Esse JPanel pode ter o leiaute que você preferir, e isso não interferirá na rolagem.
    3.3. Uma vez que a função do JScrollPane é justamente a rolagem, ao se usar um setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); a barra de rolagem horizontal nunca aparecerá, tornando o JScrollPane inútil no seu caso.

  4. Esses dados são apenas para conferência, ou podem ser alterados? Se forem apenas para conferência, JLabel’s poderiam substituir JTextField’s.

deu certo depois que fiz isso:

this.painelDeInfos.setPreferredSize(new Dimension(400, 400));

só nao sei porque hehe

o painel de infos é o que vai dentro do JScrollPane

sao paenas para conferencia
mas gostaria de colocar JTextFields com setEditable(false) questao de estética…
mas de qualquer jeito deu certo mechendo no preferredSize do JPanel que fica dentr do JScrollPane, pois esse JPanel tem um FlowLayout e quando chega no final, ele pula as linhas…
mas muito obrigado tb marcobiscaro2112 e todo o pessoal que ajudou…
eu so realmente nao entendi perfeitamente pq mechendo no referredSize funcionou…
parece que pois agora o JPanel enxerga seu limite horizontal, pois tem um preferredSize

Vlw!

[quote=fredcrs]deu certo depois que fiz isso:

this.painelDeInfos.setPreferredSize(new Dimension(400, 400));

só nao sei porque hehe

o painel de infos é o que vai dentro do JScrollPane[/quote]
Porque você definiu manualmente o tamanho preferido da janela (não delegou isso ao gerenciador de leiaute). E quando você define manualmente, os gerenciadores procuram honrar esses valores (o FlowLayout, por exemplo: caso a largura passe de 400 pixels, continue embaixo).