[RESOLVIDO] Centralizar um JPanel

Boa tarde amigos,

Estou com um probleminha na minha aplicação, então reproduzi meu probleminha num exemplo pequeno, pra poder testar. Não reparem nas telas, como falei, se trata de um exemplo.

Bem, eu tenho meu JFrame chamado Main:

No qual tenho o seguinte construtor:

[code]public Main() {
initComponents();

Form form = new Form(panel);

}
[/code]

E tenho meu JInternalFrame chamado Form:

No qual tenho o seguinte construtor:

[code]public Form(JPanel panel) {
initComponents();

this.setLocation(-5,-25);
this.setVisible(true);

try {
    this.setSelected(true);
} catch (PropertyVetoException ex) {}
    
panel.add(this);

panel.setPreferredSize(new Dimension(((Double)this.getSize().getWidth()).intValue()-5-5,((Double)this.getSize().getHeight()).intValue()-25-5));
    
int larguraPai = panel.getParent().getSize().width;
int alturaPai  = panel.getParent().getSize().height;
    
int largura    = panel.getSize().width;
int altura     = panel.getSize().height;
    
panel.setLocation((larguraPai-largura)/2,(alturaPai-altura)/2); // NÃO FUNCIONA!!!
panel.repaint();

}
[/code]

No final, obtenho o seguinte resultado:

Isso é QUASE o que eu queria. Eu queria que ele centralizasse o JPanel que eu usei pra colocar o JInternalFrame dentro. Mas não consigo! Eu assinalei no código acima a linha em que eu estou mandando centralizar. Já coloquei valores fixos naquele comando pra ver se o problema era com minhas contas, mas que nada! Ele não obedece o setLocation.

Por favor, alguém pode me ajudar?!

Grata

Pessoal, problema resolvido!

O Victor (Ratão) me ajudou pelo MSN. Deixo aqui a solução pra quem tiver um problema parecido. No construtor do Form, invés de usar setPreferredSize e depois setLocation, coloquei os seguintes comandos:

panel.getParent().setLayout(null); panel.setBounds(new Rectangle(posicaoX,posicaoY,largura,altura)); panel.repaint();

Vlw Victor!!! :wink:

Você deu um setLayout(null); no seu JFrame?

Para centralizar direitinho, você também precisa levar em consideração os insets do seu JFrame. Os insets são as áreas não uteis da decoração do frame (barra de título e borda lateral) e podem ser obtidos com o método getInsets().

Não foi nada Renata! Depois de tanto me ajudar rsrsrs…

Esse assunto que o Vini tocou eh uma boa. Eu não sabia dessa parte!
Valew!

Eu tava fazendo isso mas na mão…rs… subtraindo os pixels…

Vlw Vini!

Me desculpem ressucitar o topico, mas alguem poderia me explicar o que o ViniGodoy disse?
Eu quero centralizar um painel. Eu sei aonde ele deve estar (na metade da largura e da altura do JFrame, certo?). Mas como colocar ele ali?

[quote=RenataFA]Pessoal, problema resolvido!

O Victor (Ratão) me ajudou pelo MSN. Deixo aqui a solução pra quem tiver um problema parecido. No construtor do Form, invés de usar setPreferredSize e depois setLocation, coloquei os seguintes comandos:

panel.getParent().setLayout(null); panel.setBounds(new Rectangle(posicaoX,posicaoY,largura,altura)); panel.repaint();

Vlw Victor!!! :wink:
[/quote]

Esse meu post acima é a resposta, foi assim que funcionou.

renata,
pois e, aqui também funcionou. Mas como eu posso adicionar um JPanel embaixo desse que foi centralizado? tipo ficar 2 paineis: o de cima com alguma coisa e o de baixo com outra?
eu não teria que definir algum layout?

[quote=asd]renata,
pois e, aqui também funcionou. Mas como eu posso adicionar um JPanel embaixo desse que foi centralizado? tipo ficar 2 paineis: o de cima com alguma coisa e o de baixo com outra?
eu não teria que definir algum layout?[/quote]

Pq invés de adicionar um JPanel embaixo desse que foi centralizado vc não centraliza um novo JPanel e coloca esse seu em cima dele?

Eu tentei fazer isso, mas como o layout tá em null não consigo adicionar o outro painel :frowning:

Uso layout null em tudo aqui. Isso não é motivo pra não conseguir, alguma outra coisa deve estar errada…

bom galera aproveitando a dica do ratão, o meu não ficou exatamente no cetro dá tela mesmo calculando as coordenadas:

então modifiquei um pouco o código, criei um método onde usei flowlayout ao invès de null:

[/code]
public void centralizarContainer(Component pai, Component filho){

    // obter dimensões do pai
    int larguraPai = pai.getWidth();
    int alturaPai = pai.getHeight();

    // obter dimensões do filho
    int larguraFilho = filho.getWidth();
    int alturaFilho = filho.getWidth();

    // calcular novas coordenadas do filho  
    int novoX = (larguraPai - larguraFilho);
    int novoY = (alturaPai - alturaFilho);

    // centralizar filho
    filho.getParent().setLayout(new FlowLayout());
    filho.setPreferredSize(new Dimension(novoX, novoY));
    filho.repaint();
    filho.setLocation(novoX/2, novoY/2);

}
[/code]

Aki funcionou direitinho, testem ae e vejam se funciona. Valew

fuçando aki … achei uma solução melhor:

public void centralizarContainer(Component pai, Component filho){

        // obter dimensões do pai
        int larguraPai = pai.getWidth();
        int alturaPai = pai.getHeight();

        // obter dimensões do filho
        int larguraFilho = filho.getWidth();
        int alturaFilho = filho.getWidth();

        // calcular novas coordenadas do filho  
        int novoX = (larguraPai - larguraFilho);
        int novoY = (alturaPai - alturaFilho);

        // centralizar filho
        filho.getParent().setLayout(new GridBagLayout());
        filho.setSize(new Dimension(novoX, novoY));
        filho.repaint();
    }

Crio um gridbagLayout no lugar do Flowlayout como anteriormente.