“Immer im Vordergrund” Windows mit Java

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 setzt? Ich habe das Internet durchsucht, und alle Lösungen basieren auf einer Art JNI-Schnittstelle mit nativen Bindungen. Wahrlich, das kann nicht der einzige Weg sein, es zu tun? .. oder ist es?

Probieren Sie diese Methode der Window class aus:

Window.setAlwaysOnTop (boolesch)

Es funktioniert genauso wie der Standard im Windows TaskManager: Wechsel zu einer anderen App, aber es wird 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 auch dann oben, wenn es nicht aktiv ist

Aus meiner Beobachtung heraus habe ich festgestellt, dass das AlwaysOnTop-Privileg dem neuesten process verliehen wird, der immer an der Spitze sein sollte.

Wenn Sie also eine Anwendung haben, die setAlwaysOnTop(true) und später eine andere Anwendung diese Option verwendet, wird die zweite Anwendung setAlwaysOnTop(true) . Um dies zu setAlwaysOnTop(false) ich setAlwaysOnTop(false) und setAlwaysOnTop(true) immer dann gesetzt, wenn ein Fenster über das aktuelle Fenster kommt.

Ich habe es mit wordweb in windows überprüft. WordWeb ist eine der Anwendungen, die die AlwaysOnTop Option des OS

Ich bin mir nicht sicher, ob es mit deinem 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();} } 

Verwenden Sie nicht setFullScreenWindow, nur die Bildschirmgröße und dann setSize, und alles wird gut.