En Java, existe-t-il un moyen d’avoir une fenêtre "Toujours visible", que l’utilisateur passe au focus sur une autre application? J'ai effectué des recherches 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 le seul moyen de le faire? .. ou est-ce?
Réponses
Trop de publicités?Essayez cette méthode de l' Window
classe:
De la fenêtre.setAlwaysOnTop(boolean)
Il fonctionne de la même manière que les paramètres par défaut dans le gestionnaire des tâches de Windows: passer à une autre application, mais il montre toujours sur le dessus.
Cela a été ajoutée dans Java 1.5
Exemple de code:
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 );
}
}
Fenêtre reste visible même quand n'est pas active
De mon observation, j'ai trouvé que AlwaysOnTop privilège est donné pour le dernier processus qui a demandé à ê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 mis de l' setAlwaysOnTop(false)
et, de nouveau, setAlwaysOnTop(true)
chaque fois qu'une fenêtre est sur le dessus de la fenêtre en cours.
Je l'ai vérifié avec wordweb
en windows
. WordWeb est l'une des applications qui utilise AlwaysOnTop
option de l' OS
Je ne suis pas sûr si cela fonctionne correctement avec votre scénario de jeu.
Avertissement: 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(String args[]){
new MainWindow();}
}