web-dev-qa-db-fra.com

"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?

78
Laplie Anderson

Essayez cette méthode de la classe Window:

Window.setAlwaysOnTop (boolean)

Il fonctionne de la même manière que le comportement par défaut dans le Gestionnaire des tâches Windows: basculez vers une autre application, mais il apparaît toujours en haut.

Cela a été ajouté en 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

La fenêtre reste en haut même quand elle n'est pas active

146
OscarRyz

D'après mes observations, j'ai constaté que le privilège AlwaysOnTop est accordé au dernier processus qui demande à être toujours au top.

Ainsi, si vous avez une application pour laquelle setAlwaysOnTop(true) et une autre application utilisent cette option, le privilège est accordé à la deuxième application. Afin de contourner ce problème, j'ai défini les fonctions setAlwaysOnTop(false) et setAlwaysOnTop(true) chaque fois qu'une fenêtre se superpose à la fenêtre actuelle.

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

Je ne sais pas 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(String args[]){
              new MainWindow();}
    }
10
pinkpanther

n'utilisez pas setFullScreenWindow, obtenez simplement la taille de l'écran, puis setSize, et tout ira bien.

0
X.Zhang