Como criar janela que fique acima do JFrame Principal [Resolvido]
11 respostas
J
j_jose
Alguém sabe como não deixar as janelas irem para trás da janela principal da aplicação?
Por exemplo, quando eu abro a aplicação eu terei uma janela principal que conterá os botões e menus para chamar as outras janelas. Quando eu chamo uma nova janela(JFrame ou JDialog) a partir do JFrame principal se eu clicar no JFrame principal a nova janela se esconde atrás. Eu preciso que ela sempre fica acima do principal e se caso eu minimize o JFrame principal essa janela também minimize junto.
Um exemplo desse tipo de janela é a janela de propriedades do NetBeans. Quando agente clica com o botão direito do mouse em um componente e vai em propriedades, a janela que abre ela sem fica acima da janela principal do NetBeans e se agente minimizar o NetBeans ela minimiza junto.
Bem quanto a janela você pode usar o método .setAlwaysOnTop(true); no seu JFrame ou JDialog(modal=false). Quanto a minimizar você terá que adicionar um evento para capturar a ação de minimizar e então minimizar as janelas adicionais.
T
ThiagoHonorato
Ivan Alves, eu também preciso fazer a mesma coisa que o j_jose. Coloquei o método que você disse .setAlwaysOnTop(true), só que tive um problema.
Eu também criei uma JFrame principal onde chamo os outros frames, com esse método, o foco fica no frame chamado atravez do principal, só que se dentro desse frame eu precisar chamar outro frame não dá, ele fica por cima.
Será que existe outro método pra fazer isso?
I
Ivan_Alves
ThiagoHonorato:
Ivan Alves, eu também preciso fazer a mesma coisa que o j_jose. Coloquei o método que você disse .setAlwaysOnTop(true), só que tive um problema.
Eu também criei uma JFrame principal onde chamo os outros frames, com esse método, o foco fica no frame chamado atravez do principal, só que se dentro desse frame eu precisar chamar outro frame não dá, ele fica por cima.
Será que existe outro método pra fazer isso?
ThiagoHonorato se eu entendi direito o seu caso acho que esse método já resolve isso, já que você pode inseri-lo nas outras janelas que seu frame principal chamar.
Quando você inseri essa propriedade em 2 janelas, por exemplo, ele se sobrepõe a qualquer frame que você não tenha aplicado-o porém quando existe outro frame que tenha a mesma propriedade setada um se sobrepõe ao outro, dependendo do último frame focado.
T
ThiagoHonorato
É isso mesmo Ivan Alves, você tem razão, esse método já resolve meu problema, foi falta de fazer alguns testes…
Para sobrepor um JFrame que utilize o método .setAlwaysOnTop(true) é só acrescentar o mesmo método no novo JFrame.
j_jose se isso resolveu seu problema também, coloca ae como [RESOLVIDO]
Vlw, muito obrigado !
J
j_jose
Se eu setar .setAlwaysOnTop(true) esse JFrame vai ficar acima de todos os outros programas. Tipo se eu abrir um editor de texto por exemplo o Frame vai ficar por cima também. O que não acontece com a janela de propriedades do NetBenas como falei
I
Ivan_Alves
Não ele só vai sobrepor as janelas do seu aplicativo, não interferindo nos demais aplicativos abertos.
J
j_jose
Infelizmente não. Setando setAlwaysOnTop(true) a janela fica acima de todos os aplicativos abertos. Eu já havia testado
I
Ivan_Alves
j_jose verdade, esse método sobreboe até as janelas de outros programas dependendo do sistema(no meu caso windows 7). Caso você não queira isso use um JFrame como janela principal e JDialog(modal = false) como janela segundária e não precisa usar o método setAlwaysOnTop(true) já que o padrão é false.
J
j_jose
Ivan, o problema é que, com a janela secundária aberta, se eu clicar na janela principal a janela secundária se esconde atrás da principal
I
Ivan_Alves
j_jose:
Ivan, o problema é que, com a janela secundária aberta, se eu clicar na janela principal a janela secundária se esconde atrás da principal
Não se você instanciar seu JDialog corretamente confira o exemplo rápido que fiz abaixo e veja os parametros que passo para abrir meu JDialog:
importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjavax.swing.JButton;importjavax.swing.JDialog;importjavax.swing.JFrame;/** * * @author Ivan */publicclassTesteAbrirJDialog{JFrameframe;publicstaticvoidmain(String[]args){newTesteAbrirJDialog().iniciar();}privatevoidiniciar(){//cria um JFrame para janela principalframe=newJFrame("Janela Principal");frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//adiciona um JButton para abrir JDialogJButtonbuttonDialog=newJButton("Abrir Dialog");buttonDialog.addActionListener(newActionListener(){@OverridepublicvoidactionPerformed(ActionEvente){abrirJDialog();}});frame.add(buttonDialog);//adiciona JButtonframe.setSize(300,200);frame.setVisible(true);}privatevoidabrirJDialog(){/* Observação: o JFrame deve ser atribuido ao * seu JDialog assim como o parametro modal * todos esses foram passados no construtor * da classe JDialog */JDialogdialog=newJDialog(frame,"Dialog Teste",false);dialog.setSize(250,150);dialog.setVisible(true);}}
J
j_jose
Ivan era exatamente isso que eu estava procurando.
Realmente, passando o JFrame principal no construtor do JDialog, da certo.