“Sempre in primo piano” Windows con Java

In Java, c’è un modo per avere una finestra che è “Sempre in primo piano”, indipendentemente se l’utente passa a un’altra applicazione? Ho cercato sul Web e tutte le soluzioni si basano su una sorta di interfaccia JNI con collegamenti nativi. Davvero questo non può essere l’unico modo per farlo? .. o è?

Prova questo metodo della class Window :

Window.setAlwaysOnTop (booleano)

Funziona allo stesso modo del default nel TaskManager di Windows: passa a un’altra app ma questa si mostra sempre in primo piano.

Questo è stato aggiunto in Java 1.5

Codice d’esempio:

 import javax.swing.JFrame; import javax.swing.JLabel; public class Annoying { public static void main(String[] args) { JFrame frame = new JFrame("Hello!!"); // Set's the window to be "always on top" frame.setAlwaysOnTop( true ); frame.setLocationByPlatform( true ); frame.add( new JLabel(" Isn't this annoying?") ); frame.pack(); frame.setVisible( true ); } } 

alt text

La finestra rimane in primo piano anche quando non è triggers

Dalla mia osservazione ho scoperto che il privilegio di AlwaysOnTop è dato all’ultima procedura che ha richiesto di essere sempre al top.

Pertanto, se si dispone di un’applicazione che setAlwaysOnTop(true) e in seguito un’altra applicazione utilizza questa opzione, il privilegio viene assegnato alla seconda applicazione. Per ovviare a questo, ho impostato setAlwaysOnTop(false) e nuovamente setAlwaysOnTop(true) ogni volta che una finestra si trova in cima alla finestra corrente.

L’ho controllato con wordweb in windows . WordWeb è una delle applicazioni che utilizza l’opzione AlwaysOnTop dal OS

Non sono sicuro se funziona correttamente con lo scenario del gioco.

Avvertenza : non sono a conoscenza degli effetti collaterali.

Ecco l’esempio di codice:

 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();} } 

non utilizzare setFullScreenWindow, solo ottenere le dimensioni dello schermo e quindi setSize, e tutto andrà bene.