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?
[Closed] Verificar Focus
8 Respostas
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
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!
}
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
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.
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???
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.
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);
}
}
}
});
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