[Closed] Verificar Focus

8 respostas
W

Pessoal queria atribuir a tecla de atalho esc para fechar o frame, entretanto queria que isso soh acontecesse se não houvesse nenhuma internaframe aberta…
tenho que fazer isVisible em cada InternalFrame ou existe uma forma mais pratica ou mais ágil de fazer isso?

8 Respostas

W

tentei fazer assim:

if(mainPanel.getAllFrames()==null)
{
	System.exit(0);
}

o codigo acima deveria verificar se existem frames abertos no mainFrame que eh o JDesktopFrame do Frame Principal
caso não houvesse nenhuma InternalFrame aberta ele sairia entretanto acho que isso se deve ao fato da DefaultCloseOperation dos meus JInternalFrame ser HIDE_ON_CLOSE e nao EXIT_ON_CLOSE

obrigado pela atenção de vocês

M

Para saber quantas janelas existem abertas, use o método getAllFrames() de JDesktopPane e a partir do array retornado, basta verificar o valor do atributo length. Por exemplo:

// supondo que seu JDesktopPane chame-se desktop:
if (desktop.getAllFrames().length == 0) {
    // não tem nenhuma janela aberta. Faça algo aqui!
}
W

Continua não satisfazendo o requisito, ele diz que existem 4 jinternalframes abertos, exatamente a quantidade total deles
será que não tem a ver com o fato deles estarem somente hide???
tava pensando pegar o array e fazer um while e ir testando se cada elemento do array isVisible
pq eles existem mesmo só nao estão visible

M

Talvez essa seja a solução… mas é estranho não funcionar como deveria, pois olhe só o que diz a documentação do método getAllFrames():

Todavia, tente fazer o loop e veja o resultado.

W

Então usei o getAllFrames e verifikei um por um do array com isVisible, então pergunto se o usuario deseja que o programa feche todas as janelas antes de sair.
entretanto surgiu uma duvida…
não sei se pergunto se ele deseja sair ou se fecha o visible que tiver com o foco, to pensando na segunda opção
os usuarios do sistema gostam mais de teclado, acham mais rapido, então iria atribuir uma função mais ampla à tecla de escape!
o que me dizem???

W

Pessoal eu executei o procedimento descrito acim, dei um getAllFrames() e varry o array verificando se a janela isVisible, porem queria fechar somente a janela que tah com o foco.
entretanto sempre que um JInternalFrame é aberto eu posiciono o foco em um elemento doformulário, pro usuario nao precisar clicar antes de começar digitar
logo a janela nao é o focusOwner e sim o JComponnent da janela.

gostaria de algumas sugestões de como eu posso verificar se a janela atual tah com o foco em algum dos seus componentes.

M

Use o método getSelectedFrame() de JDesktopPane. Pelo que entendi, você quer fazer algo como:

// supondo que seu JDesktopPane chame-se desktop
desktop.addKeyListener(new KeyAdapter() { // adiciona um KeyListener
    public void keyPressed(KeyEvent e) {
        if (e.getKeyCode() == KeyEvent.VK_ESCAPE) { // verifica se pressionaram o ESC
            JInternalFrame aberto = desktop.getSelectedFrame(); // pega o internal frame com foco
            if (aberto != null) { // se não for nulo, esconde o JInternalFrame
                aberto.setVisible(false);
            }
        }
    }
});
W

nao sei se o meu ficou mais lento que o seu seria mas funcionou exatamento como eu pretendia que funcionasse

for(int cont=mainPanel.getAllFrames().length-1; cont>=0; cont-- )
					{
						if(internalFrames[cont].isVisible() && internalFrames[cont].isSelected())
						{
								visibleFrames = true;
								internalFrames[cont].doDefaultCloseAction();
								for(int cnt=mainPanel.getAllFrames().length-1; cnt>=0; cnt--)
								{
									if(internalFrames[cnt].isVisible())
									{
										try
										{
											internalFrames[cnt].setSelected(true);
										}
										catch (PropertyVetoException e1)
										{
											e1.printStackTrace();
										}
									}
								}
						}
					}
					if(visibleFrames==false)
					{
						tk.setLockingKeyState(KeyEvent.VK_CAPS_LOCK, false);
						System.exit(0);
					}

daew assim varrendo o array do fim pro começo torna possivel eu apertar esc e ele fechar as janelas na ordem correta ou seja
do ultima janela aberta pra primeira janela aberta.
nao testei tua solução marco mas desse jeito que eu fiz funcionou exatamente como eu pretendia.
graças à resposta do Dirceu Roden pra eu usar o metodo isSelected
mas mesmo assim muito obrigado, assim que tiver oportunidade irei testar o teu código

Criado 13 de fevereiro de 2009
Ultima resposta 15 de fev. de 2009
Respostas 8
Participantes 2