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!
Jinternalframe aparecendo por atrás - resolvido!
8 Respostas
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ê.
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.
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.
Poisé joselitotal, tá estranho esse negocio, dos metodos que vc citou o unico que funciona aqui é setSelected(). Nem o getDesktopManager().activateFrame() funciuonow.
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 =(.
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();
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
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.