En Java, y a-t-il un moyen d'avoir une fenêtre qui est «toujours au top», que l'utilisateur passe le focus sur une autre application? J'ai cherché sur le Web et toutes les solutions s'appuient sur une sorte d'interface JNI avec des liaisons natives. Vraiment, cela ne peut pas être la seule façon de le faire? .. ou est-ce?
java
user-interface
swing
awt
Laplie Anderson
la source
la source
D'après mon observation, j'ai trouvé que le privilège AlwaysOnTop est accordé au dernier processus qui a demandé d'être toujours au top.
Donc, si vous avez une application qui
setAlwaysOnTop(true)
et plus tard une autre application utilise cette option, le privilège est donné à la deuxième application. Afin de contourner ce problème, j'ai défini lesetAlwaysOnTop(false)
et àsetAlwaysOnTop(true)
chaque fois qu'une fenêtre apparaît au-dessus de la fenêtre actuelle.Je l' ai vérifié avec
wordweb
danswindows
. WordWeb est l'une des applications qui utilise l'AlwaysOnTop
option duOS
Je ne sais pas si cela fonctionne correctement avec votre scénario de jeu.
Attention : je ne connais pas les 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(String args[]){ new MainWindow();} }
la source
n'utilisez pas setFullScreenWindow, obtenez simplement la taille de l'écran, puis setSize, et tout ira bien.
la source