Pytanie "Zawsze na topie" Windows z Javą


Czy w Javie istnieje sposób na wyświetlenie okna "Zawsze na wierzchu", niezależnie od tego, czy użytkownik przełącza fokus na inną aplikację? Przeszukałem sieć, a wszystkie rozwiązania opierają się na interfejsie JNI z powiązaniami natywnymi. Naprawdę to nie może być jedyny sposób, żeby to zrobić? .. czy to prawda?


76
2017-11-18 05:37


pochodzenie




Odpowiedzi:


Wypróbuj tę metodę Window klasa:

Window.setAlwaysOnTop (boolean)

Działa tak samo, jak domyślne w Windows TaskManager: przełącz się na inną aplikację, ale zawsze wyświetla się na wierzchu.

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

alt text

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


139
2017-11-18 05:46



można by pomyśleć, że proste wyszukiwanie "aplikacji Java zawsze na wierzchu" będzie miało tę odpowiedź, ale nie może jej znaleźć. Dzięki. - Laplie Anderson
Zgadnij co. Teraz to robi !! :) Przynosi cię tutaj! google.com/search?&q=java+aplikacja+wszystkich+w+topie - OscarRyz
To jest proste i niesamowite. Też szukałem czegoś takiego, ale nie wiedziałem, że zaimplementowali to w Javie 1.5. Dzięki za publikację. - Kushal Paudyal
Niestety nie działa to dla mnie podczas uruchamiania aplikacji pełnoekranowej, takiej jak gra wideo. Czy ktoś wie, jak zmusić go do tego, by znalazł się na szczycie? - Dream Lane
@Dream Lane prawdopodobnie zadałbym to jako nowe pytanie - rogerdpack


Z moich obserwacji wynika, że ​​przywilej AlwaysOnTop jest przyznawany najnowszemu procesowi, który wymagał bycia zawsze na wierzchu.

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

Sprawdziłem to wordweb w windows. WordWeb to jedna z aplikacji, które używa AlwaysOnTop opcja z OS

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

Ostrzeżenie: Nie jestem świadomy efektó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();}
    }

10
2018-01-04 16:15



Ustawienie na false i true, gdy inne okno pojawi się na górze, nie brzmi jak działające rozwiązanie z jednego prostego powodu - a co jeśli druga aplikacja robi to samo? - Trejkaz
@Trejkaz Cóż, to jest ważny punkt. Nie mam już teraz kontaktu z huśtawką. - pinkpanther
Działa to doskonale w moim przypadku użycia! Pierwszym z nich było przywrócenie wartości false. - rococo


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


0
2017-07-22 03:11



Czy jest to odpowiedź czy komentarz? - Failed Scientist