87 votes

"Toujours au top" Windows avec Java

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?

162voto

OscarRyz Points 82553

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

alt text

Fenêtre reste visible même quand n'est pas active

11voto

pinkpanther Points 2181

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X