Windows «toujours au top» avec Java

85

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?

Laplie Anderson
la source

Réponses:

159

Essayez cette méthode de la Windowclasse:

Window.setAlwaysOnTop (booléen)

Cela fonctionne de la même manière que la valeur par défaut dans le Gestionnaire des tâches Windows: passez à une autre application mais elle s'affiche toujours en haut.

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

texte alternatif

La fenêtre reste au-dessus même lorsqu'elle n'est pas active

OscarRyz
la source
3
on pourrait penser qu'une simple recherche de «application java toujours au top» sur aurait cette réponse, mais elle ne l'a pas trouvée. Merci.
Laplie Anderson
46
Devine quoi. Maintenant c'est le cas !! :) Cela vous amène ici! google.com/search?&q=java+application+always+on+top
OscarRyz
C'est simple et génial. Je cherchais également quelque chose comme ça, mais je ne savais pas qu'ils l'ont implémenté dans Java 1.5. Merci d'avoir posté.
Kushal Paudyal
2
Malheureusement, cela ne fonctionne pas pour moi lorsque j'exécute une application plein écran telle qu'un jeu vidéo. Quelqu'un connaît-il un moyen de le forcer au sommet dans cette situation?
Dream Lane
1
@Dream Lane, je poserais probablement cela comme une nouvelle question
rogerdpack
11

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 le setAlwaysOnTop(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 wordwebdans windows. WordWeb est l'une des applications qui utilise l' AlwaysOnTopoption 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();}
    }
panthère rose
la source
Le redéfinir sur false et true lorsqu'une autre fenêtre apparaît ne semble pas être une solution viable pour une raison simple - et si l'autre application faisait la même chose?
Trejkaz
@Trejkaz Eh bien, c'est un point valable. Je ne suis plus en contact avec le swing maintenant.
pinkpanther
Cela fonctionne parfaitement pour mon cas d'utilisation! Le remettre à false était d'abord la clé.
rococo
0

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

X.Zhang
la source
Est-ce une réponse ou un commentaire?
Failed Scientist
@FailedScientist un commentaire glorifié
clankill3r