"Immer an der Spitze" Windows mit Java

85

Gibt es in Java eine Möglichkeit, ein Fenster zu haben, das "Immer im Vordergrund" ist, unabhängig davon, ob der Benutzer den Fokus auf eine andere Anwendung wechselt? Ich habe das Web durchsucht und alle Lösungen basieren auf einer Art JNI-Schnittstelle mit nativen Bindungen. Wirklich, das kann nicht der einzige Weg sein, es zu tun? .. oder doch?

Laplie Anderson
quelle

Antworten:

159

Versuchen Sie diese Methode der WindowKlasse:

Window.setAlwaysOnTop (boolean)

Es funktioniert genauso wie die Standardeinstellung im Windows TaskManager: Wechseln Sie zu einer anderen App, es wird jedoch immer oben angezeigt.

Dies wurde in Java 1.5 hinzugefügt

Beispielcode:

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

Das Fenster bleibt oben, auch wenn es nicht aktiv ist

OscarRyz
quelle
3
Sie würden denken, eine einfache Suche nach "Java-Anwendung immer oben" würde diese Antwort haben, aber sie konnte sie nicht finden. Vielen Dank.
Laplie Anderson
45
Erraten Sie, was. Jetzt tut es !! :) Es bringt dich hierher! google.com/search?&q=java+application+always+on+top
OscarRyz
Das ist einfach und großartig. Ich suchte auch nach so etwas, wusste aber nicht, dass sie dies in Java 1.5 implementiert haben. Danke fürs Schreiben.
Kushal Paudyal
2
Leider funktioniert dies bei mir nicht, wenn eine Vollbildanwendung wie ein Videospiel ausgeführt wird. Kennt jemand einen Weg, um es in dieser Situation nach oben zu zwingen?
Dream Lane
1
@ Dream Lane Ich würde das wahrscheinlich als neue Frage stellen
Rogerdpack
11

Bei meiner Beobachtung stellte ich fest, dass das AlwaysOnTop-Privileg für den neuesten Prozess erteilt wurde, der immer an der Spitze sein musste.

Wenn Sie also eine Anwendung haben, die setAlwaysOnTop(true)und später eine andere Anwendung diese Option verwendet, wird die Berechtigung der zweiten Anwendung erteilt. Um dies zu umgehen, habe ich das setAlwaysOnTop(false)und setAlwaysOnTop(true)immer wieder eingestellt, wenn ein Fenster über dem aktuellen Fenster angezeigt wird.

Ich habe es mit checked wordwebin windows. WordWeb ist eine der Anwendungen, die die AlwaysOnTopOption aus dem verwendetOS

Ich bin mir nicht sicher, ob es mit Ihrem Spielszenario richtig funktioniert.

Warnung : Ich bin mir der Nebenwirkungen nicht bewusst.

Hier ist das Codebeispiel:

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();}
    }
Pinker Panther
quelle
Wenn Sie ein anderes Fenster wieder auf false und true setzen, klingt dies aus einem einfachen Grund nicht nach einer praktikablen Lösung - was ist, wenn die andere Anwendung dasselbe tut?
Trejkaz
@ Trejkaz Nun, das ist ein gültiger Punkt. Ich bin jetzt nicht mehr in Kontakt mit Swing.
Pinkpanther
Dies funktioniert perfekt für meinen Anwendungsfall! Das Zurücksetzen auf false war der Schlüssel.
Rokoko
0

Verwenden Sie nicht setFullScreenWindow, sondern ermitteln Sie die Bildschirmgröße und dann setSize, und alles wird in Ordnung sein.

X. Zhang
quelle
Ist es eine Antwort oder ein Kommentar?
Gescheiterter Wissenschaftler
@FailedScientist ein verherrlichter Kommentar
clankill3r