Em Java, existe uma maneira de ter uma janela "Sempre no topo", independentemente se o usuário muda o foco para outro aplicativo? Eu pesquisei na web e todas as soluções tendem a algum tipo de interface JNI com ligações nativas. Na verdade, essa não pode ser a única maneira de fazer isso? .. ou é?
java
user-interface
swing
awt
Laplie Anderson
fonte
fonte
De minha observação, descobri que o privilégio AlwaysOnTop é concedido ao processo mais recente que solicitou estar sempre no topo.
Portanto, se você tiver um aplicativo que
setAlwaysOnTop(true)
e posteriormente outro aplicativo use essa opção, o privilégio será concedido ao segundo aplicativo. Para contornar isso, configurei osetAlwaysOnTop(false)
e novamentesetAlwaysOnTop(true)
sempre que uma janela aparecer no topo da janela atual.Eu verifiquei com
wordweb
emwindows
. WordWeb é um dos aplicativos que usa aAlwaysOnTop
opção doOS
Não tenho certeza se funciona corretamente com o cenário do seu jogo.
Aviso : não estou ciente dos efeitos colaterais.
Aqui está o exemplo de código:
import java.awt.event.*; import javax.swing.*; public class MainWindow extends JFrame implements WindowFocusListener { public MainWindow() { addWindowFocusListener(this); setAlwaysOnTop(true); this.setFocusable(true); // this.setFocusableWindowState(true); panel = new JPanel(); //setSize(WIDTH,HEIGHT); setUndecorated(true); setLocation(X,Y); setExtendedState(MAXIMIZED_BOTH); setVisible(true); } public void windowGainedFocus(WindowEvent e){} public void windowLostFocus(WindowEvent e) { if(e.getNewState()!=e.WINDOW_CLOSED){ //toFront(); //requestFocus(); setAlwaysOnTop(false); setAlwaysOnTop(true); //requestFocusInWindow(); System.out.println("focus lost"); } } private JPanel panel; private static final int WIDTH = 200; private static final int HEIGHT = 200; private static final int X = 100; private static final int Y = 100; public static void main(String args[]){ new MainWindow();} }
fonte
não use setFullScreenWindow, apenas pegue o tamanho da tela e então setSize, e tudo ficará bem.
fonte