Temos um aplicativo Java que precisa ser colocado em primeiro plano quando um mecanismo de telecontrole ativa algo no aplicativo.
Para conseguir isso, percebemos no método chamado da classe que representa a estrutura de nossa aplicação (extensão de a JFrame
) após a implementação:
setVisible(true);
toFront();
No Windows XP isso funciona na primeira vez que é chamado, na segunda vez apenas a guia da barra de tarefas pisca, o quadro não vem mais para a frente. O mesmo vale para Win2k. No Vista parece funcionar bem.
Você tem alguma ideia?
toFront()
para o EDT usandoinvokeLater
. Há uma resposta simples incluída abaixo, mas não é a resposta aceita. Funciona, no entanto. Perfeitamente.Respostas:
Uma possível solução é:
fonte
Eu tive o mesmo problema ao trazer um
JFrame
para a frente no Ubuntu (Java 1.6.0_10). E a única maneira de resolver isso é fornecendo umWindowListener
. Especificamente, tive que definir meuJFrame
para ficar sempre no topo sempre quetoFront()
for invocado e fornecerwindowDeactivated
um manipulador de eventos parasetAlwaysOnTop(false)
.Portanto, aqui está o código que pode ser colocado em uma base
JFrame
, que é usado para derivar todos os quadros de aplicativos.Sempre que seu porta-retratos deve ser exibido ou colocado em primeiro plano
frame.setVisible(true)
.Desde que mudei para o Ubuntu 9.04, parece não haver necessidade de ter um
WindowListener
para invocarsuper.setAlwaysOnTop(false)
- como pode ser observado; este código foi movido para os métodostoFront()
esetVisible()
.Observe que o método
setVisible()
sempre deve ser chamado em EDT.fonte
.setAlwaysOnTop(true);
era o único que funcionou para mim quando se utiliza um JWindow.setAlwaysOnTop(true)
é a única maneira de executá-lo no Windows 10 - obrigado!O Windows tem a facilidade de evitar que as janelas roubem o foco; em vez disso, ele pisca o ícone da barra de tarefas. No XP, ele está ativado por padrão (o único lugar que vi para alterá-lo é usando o TweakUI, mas há uma configuração de registro em algum lugar). No Vista, eles podem ter alterado o padrão e / ou exposto como uma configuração acessível ao usuário com a interface do usuário pronta para usar.
Evitar que as janelas se forcem para a frente e obtenham o foco é um recurso desde o Windows 2K (e eu, por exemplo, sou grato por isso).
Dito isso, tenho um pequeno aplicativo Java que uso para me lembrar de registrar minhas atividades enquanto trabalho e torna-se a janela ativa a cada 30 minutos (configurável, claro). Ele sempre funciona de forma consistente no Windows XP e nunca pisca a janela da barra de título. Ele usa o seguinte código, chamado no thread de IU como resultado de um evento de timer disparado:
(a primeira linha é restaurada se minimizada ... na verdade ela restauraria se maximizada também, mas eu nunca fiz isso).
Embora eu geralmente tenha este aplicativo minimizado, muitas vezes ele está simplesmente atrás do meu editor de texto. E, como eu disse, sempre funciona.
Tenho uma ideia de qual poderia ser o seu problema - talvez você tenha uma condição de corrida com a chamada setVisible (). toFront () pode não ser válido a menos que a janela seja realmente exibida quando for chamada; Eu tive esse problema com requestFocus () antes. Você pode precisar colocar a chamada toFront () em um ouvinte da IU em um evento ativado por janela.
07-09-2014: Em algum ponto no tempo, o código acima parou de funcionar, talvez em Java 6 ou 7. Depois de alguma investigação e experimentação, tive que atualizar o código para substituir o
toFront
método da janela, fazer isso (em conjunto com o código modificado de que está acima):A partir do Java 8_20, esse código parece estar funcionando bem.
fonte
super.setAlwaysOnTop(false);
que a janela nem sempre fica para cima, o que é necessário para nos livrarmos dotrue
que configuramos anteriormente para trazer a janela para a frente, correto? Estou perguntando porque com o seu código a janela ainda está sempre no topo no meu caso, o que eu obviamente não quero. Executando jre1.8.0_66 no Windows 10.Aqui está um método que REALMENTE funciona (testado no Windows Vista): D
A variável fullscreen indica se você deseja que o aplicativo seja executado em tela inteira ou em janela.
Isso não pisca a barra de tarefas, mas traz a janela para a frente de forma confiável.
fonte
Hj, todos os seus métodos não estão funcionando para mim, no Fedora KDE 14. Eu tenho uma maneira suja de trazer uma janela para a frente, enquanto esperamos que o Oracle conserte esse problema.
E isso funciona perfeitamente no meu Fedora KDE 14 :-)
fonte
Este método simples funcionou perfeitamente para mim no Windows 7:
fonte
repaint()
não é necessário, oinvokeLater()
fez. Obrigado.Testei suas respostas e apenas a de Stefan Reich funcionou para mim. Embora eu não tenha conseguido restaurar a janela ao seu estado anterior (maximizada / normal). Eu achei esta mutação melhor:
Isso é em
setState
vez desetExtendedState
.fonte
A maneira mais simples que descobri que não tem inconsistência entre as plataformas:
setVisible (false); setVisible (true);
fonte
As regras que regem o que acontece quando você .toFront () um JFrame são as mesmas no Windows e no Linux:
-> se uma janela do aplicativo existente for atualmente a janela em foco, então o foco muda para a janela solicitada -> se não, a janela simplesmente pisca na barra de tarefas
MAS :
-> novas janelas obtêm foco automaticamente
Então, vamos explorar isso! Você quer trazer uma janela para a frente, como fazer? Bem :
Ou, em código java:
fonte
Existem várias advertências no javadoc para o método toFront () que podem estar causando o problema.
Mas vou adivinhar de qualquer maneira, quando "apenas a guia na barra de tarefas piscar", o aplicativo foi minimizado? Nesse caso, a seguinte linha do javadoc pode ser aplicada:
"Se esta janela estiver visível, traz esta janela para a frente e pode torná-la a janela em foco."
fonte
Para evitar que a janela perca o foco ao voltar a ficar visível após ser escondida, tudo o que é necessário é:
Igual a:
fonte