“Toujours au top” Windows avec Java

En Java, existe-t-il un moyen d’avoir une fenêtre «Toujours visible», que l’utilisateur bascule ou non sur une autre application? J’ai cherché sur le Web et toutes les solutions s’appuient sur une interface JNI avec des liaisons natives. Vraiment, cela ne peut pas être la seule façon de le faire? Ou est-ce?

Essayez cette méthode de la classe Window :

Window.setAlwaysOnTop (booléen)

Il fonctionne de la même manière que le défaut dans le TaskManager de Windows: basculez vers une autre application, mais celle-ci est toujours visible.

Ceci a été ajouté dans Java 1.5

Exemple de code:

 import javax.swing.JFrame; import javax.swing.JLabel; public class Annoying { public static void main(Ssortingng[] 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 ); } } 

texte alt

La fenêtre rest sur le dessus même quand elle n’est pas active

De mon observation, j’ai trouvé que le privilège AlwaysOnTop est donné au dernier processus qui demande à être toujours au top.

Donc, si vous avez une application dont setAlwaysOnTop(true) et plus tard une autre application utilise cette option, le privilège est donné à la deuxième application. Pour contourner ce setAlwaysOnTop(false) j’ai défini setAlwaysOnTop(false) et à nouveau setAlwaysOnTop(true) chaque fois qu’une fenêtre apparaît au-dessus de la fenêtre en cours.

Je l’ai vérifié avec wordweb dans windows . WordWeb est l’une des applications qui utilise l’option AlwaysOnTop du OS

Je ne suis pas sûr si cela fonctionne correctement avec votre scénario de jeu.

Attention : je ne suis pas au courant des effets secondaires.

Voici l’exemple de code:

 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(Ssortingng args[]){ new MainWindow();} } 

N’utilisez pas setFullScreenWindow, obtenez simplement la taille de l’écran et ensuite setSize, et tout ira bien.