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?
java
user-interface
swing
awt
Laplie Anderson
źródło
źródło
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łemsetAlwaysOnTop(false)
i ponowniesetAlwaysOnTop(true)
za każdym razem, gdy jakieś okno pojawia się na górze bieżącego okna.Sprawdziłem to
wordweb
wwindows
. WordWeb to jedna z aplikacji korzystającychAlwaysOnTop
z 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ódło
nie używaj setFullScreenWindow, po prostu pobierz rozmiar ekranu, a następnie setSize i wszystko będzie dobrze.
źródło