Jinternalframe aparecendo por atrás - resolvido!

8 respostas
joselitotal

Olá pessoal desenvolvi uma aplicação aqui, e estou utilizando jinternalframe e o jdesktoppane, novas janelas são abertas de acordo com evento do mouse, só que não consigo deixá-las aparecendo na frente, elas sempre aparecem por tras de um jinternalframe existente. Vale lembrar que fiz uma busca aqui no fórum e sempre indicam um tópico que tá quebrado, algo com o método movetofront() que já tentei utilizar mas não funcionou, se alguem puder me ajudar de bom grado , fico muitíssimo agradecido!

8 Respostas

Adriel

eu faço da seguinte forma, uso o metodo setSelected(true) do JInternalFrame. É preciso colocar dentro de um bloco try por que esse metodo gera uma exception, mas isso a ide faz por você.

joselitotal

Olá Adriel, obrigado pela resposta, infelizmente já tentei com:

this.iFrame1.setSelected(true);

this.iFrame1.requestFocus();

this.iFrame1.requestFocusInWindow();

this.iFrame1.moveToFront();

e nenhum deles trouxe o novo jinternalframe pra frente, deve haver algum design pattern pra resolver isso ai, mesmo assim muito obrigado, e aguardo novas sugestões.

Adriel

Então brother… dá pra ti postar o trecho do código, fica mais facil de saber o que tá dando errado. Pois eu uso o setSelected() num projetinho MDI aqui na empresa.

Adriel

Poisé joselitotal, tá estranho esse negocio, dos metodos que vc citou o unico que funciona aqui é setSelected(). Nem o getDesktopManager().activateFrame() funciuonow.

joselitotal

Então cara, to fritando em cima disso aqui, preciso acertar isso pra apresentar meu TCC sexta feira… estou fazendo da seguinte forma:

crio um layeredPanel:

JLayeredPane desktop = new JLayeredPane();
setContentPane(desktop);

depois crio um internalFrame e adiciono o component graph( representação topologica da rede da universidade ):

// gera o grafo
JInternalFrame jif = new JInternalFrame();
jif.add(graph);
jif.setVisible(true);
jif.pack();
getContentPane().add(jif);
desktop.setVisible(true);

ai beleza, ele gera a topologia da rede e tal, dai cada vez que passo o mouse por cima de um equipamento, ele tem que me mostrar o tráfego de rede naquele equipamento, dai ele abre u novo JInternalFrame, e é esse M… que fica por baixo , e não consigo colocar ele por cima de jeito nenhum:

dentro do listener do mouse:

this.iFrame = new JInternalFrame();
this.iFrame.setSize(700, 300);
this.iFrame.setTitle("Equipamento - " + cell.toString());
this.iFrame.add( new MyPanel(cell.toString(),this.IP,this.PORTA) );                         
this.iFrame.setLocation(x+40, y+50);                         
this.iFrame.setDefaultCloseOperation(JInternalFrame.DISPOSE_ON_CLOSE);
this.iFrame.setFocusable(true);
this.iFrame.moveToFront();
this.iFrame.requestFocus();
try {
           this.iFrame.setSelected(true);
} catch (PropertyVetoException ex) {
            Logger.getLogger(mouseListener.class.getName()).log(Level.SEVERE, null, ex);
}
this.iFrame.setVisible(true);
this.container.add(this.iFrame);
this.vetorJanelas.add(iFrame);
ipAnterior = cell.toString();

e mesmo assim ele insiste em aparecer por baixo =(.

Adriel

Então brother testei aqui e funcionou legalzinho… já sei qual é o seu problema…
É que você deve primeiro adicionar o JInternalFrame ao conteiner e depois chamar o metodo setSelected(), fiz da maneira que está no listener do mouse que você passow, primeiro chamando o metodo e depois adicionando e ocorreu o vc disse, o JInternalFrame não é selecionado. Fiz primeiro adicionando o bichão(JInternalFrame) ao conteiner e funfow de boa.
Testa ae, acredito que seja isso.

this.iFrame = new JInternalFrame(); this.iFrame.setSize(700, 300); this.iFrame.setTitle("Equipamento - " + cell.toString()); this.iFrame.add( new MyPanel(cell.toString(),this.IP,this.PORTA) ); this.iFrame.setLocation(x+40, y+50); this.iFrame.setDefaultCloseOperation(JInternalFrame.DISPOSE_ON_CLOSE); this.iFrame.setFocusable(true); this.iFrame.moveToFront(); this.iFrame.requestFocus(); this.container.add(this.iFrame); try { this.iFrame.setSelected(true); } catch (PropertyVetoException ex) { Logger.getLogger(mouseListener.class.getName()).log(Level.SEVERE, null, ex); } this.iFrame.setVisible(true); this.vetorJanelas.add(iFrame); ipAnterior = cell.toString();

joselitotal

Adriel, obrigado pela atenção, consegui resolver o problema da seguinte maneira, alterando o nível dele quando estou inicializando conforme abaixo:

this.container.add(this.iFrame,new Integer(10),0);

onde o container ali veio por parametro, e é o JLayeredPanel , observe que o zero , faz com que o Component seja o mais próximo da tela, quem tiver a mesma dúvida pode dar uma olhada neste ótimo tutorial da sun sobre JInternalFrames e JLayeredPanel:
http://java.sun.com/docs/books/tutorial/uiswing/components/layeredpane.html#position

gdonadel

Adriel:
Então brother testei aqui e funcionou legalzinho… já sei qual é o seu problema…
É que você deve primeiro adicionar o JInternalFrame ao conteiner e depois chamar o metodo setSelected(), fiz da maneira que está no listener do mouse que você passow, primeiro chamando o metodo e depois adicionando e ocorreu o vc disse, o JInternalFrame não é selecionado. Fiz primeiro adicionando o bichão(JInternalFrame) ao conteiner e funfow de boa.
Testa ae, acredito que seja isso.

this.iFrame = new JInternalFrame(); this.iFrame.setSize(700, 300); this.iFrame.setTitle("Equipamento - " + cell.toString()); this.iFrame.add( new MyPanel(cell.toString(),this.IP,this.PORTA) ); this.iFrame.setLocation(x+40, y+50); this.iFrame.setDefaultCloseOperation(JInternalFrame.DISPOSE_ON_CLOSE); this.iFrame.setFocusable(true); this.iFrame.moveToFront(); this.iFrame.requestFocus(); this.container.add(this.iFrame); try { this.iFrame.setSelected(true); } catch (PropertyVetoException ex) { Logger.getLogger(mouseListener.class.getName()).log(Level.SEVERE, null, ex); } this.iFrame.setVisible(true); this.vetorJanelas.add(iFrame); ipAnterior = cell.toString();

Obrigado Adriel, consegui resolver meu problema com a sua sugestao.
adicionei o jinternalframe no desktoppane primeiro, depois dei setselected(true) e se fez a luz.

obrigado novamente.

Criado 24 de novembro de 2008
Ultima resposta 25 de mar. de 2011
Respostas 8
Participantes 3