„Zawsze na wierzchu” Windows z Javą

85

Czy w Javie istnieje sposób, aby okno było „Zawsze na wierzchu”, niezależnie od tego, czy użytkownik przełączy fokus na inną aplikację? Przeszukałem Internet i wszystkie rozwiązania opierają się na jakimś interfejsie JNI z natywnymi powiązaniami. Naprawdę nie może to być jedyny sposób, aby to zrobić? .. czy to prawda?

Laplie Anderson
źródło

Odpowiedzi:

159

Wypróbuj tę metodę Windowklasy:

Window.setAlwaysOnTop (boolean)

Działa w taki sam sposób, jak domyślny w Windows TaskManager: przełącz się na inną aplikację, ale zawsze wyświetla się na górze.

Zostało to dodane w Javie 1.5

Przykładowy kod:

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

tekst alternatywny

Okno pozostaje na górze, nawet gdy nie jest aktywne

OscarRyz
źródło
3
można by pomyśleć, że proste wyszukiwanie „aplikacja java zawsze na wierzchu” przyniosłoby tę odpowiedź, ale nie można jej znaleźć. Dzięki.
Laplie Anderson
46
Zgadnij co. Teraz to robi !! :) To cię tu sprowadza! google.com/search?&q=java+application+always+on+top
OscarRyz
To jest proste i niesamowite. Szukałem też czegoś takiego, ale nie wiedziałem, że zaimplementowali to w Javie 1.5. Dzięki za wysłanie wiadomości.
Kushal Paudyal
2
Niestety nie działa to dla mnie podczas uruchamiania aplikacji pełnoekranowej, takiej jak gra wideo. Czy ktoś wie, jak w takiej sytuacji zmusić go do wejścia na szczyt?
Dream Lane
1
@Dream Lane Prawdopodobnie zadałbym to jako nowe pytanie
rogerdpack
11

Z moich obserwacji stwierdziłem, że przywilej AlwaysOnTop jest nadawany najnowszemu procesowi, który wymagał, aby być zawsze na szczycie.

Tak więc, jeśli masz aplikację, która setAlwaysOnTop(true)później inna aplikacja korzysta z tej opcji, uprawnienie jest nadawane drugiej aplikacji. Aby obejść ten problem, ustawiłem setAlwaysOnTop(false)i ponownie setAlwaysOnTop(true)za każdym razem, gdy jakieś okno pojawia się na górze bieżącego okna.

Sprawdziłem to wordwebw windows. WordWeb to jedna z aplikacji korzystających AlwaysOnTopz opcji zOS

Nie jestem pewien, czy to działa poprawnie w twoim scenariuszu gry.

Ostrzeżenie : nie jestem świadomy skutków ubocznych.

Oto przykład kodu:

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();}
    }
Różowa Pantera
źródło
Ustawienie go ponownie na fałsz i prawda, gdy pojawi się inne okno, nie brzmi jak działające rozwiązanie z jednego prostego powodu - a co, jeśli druga aplikacja zrobi to samo?
Trejkaz
@Trejkaz Cóż, to ważny punkt. Nie mam już kontaktu z swingiem.
pinkpanther
Działa to doskonale w moim przypadku użycia! Kluczem było ustawienie go z powrotem na false.
rokoko
0

nie używaj setFullScreenWindow, po prostu pobierz rozmiar ekranu, a następnie setSize i wszystko będzie dobrze.

X.Zhang
źródło
Czy to odpowiedź czy komentarz?
Failed Scientist
@FailedScientist gloryfikowany komentarz
clankill3r