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.
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.
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:
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().
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?
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:
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?
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
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.