„Always on Top“ Windows mit Java
-
08-07-2019 - |
Frage
In Java gibt es eine Möglichkeit, ein Fenster zu haben, die „Always on top“ unabhängig davon, ob der Benutzer wechselt in einer anderen Anwendung konzentrieren? Ich habe das Web durchsucht, und alle Lösungen anlehnen, um irgendeine Art von JNI-Schnittstelle mit nativen Bindungen. Wirklich kann dies nicht den einzigen Weg, es zu tun? .. oder ist es?
Lösung
Versuchen Sie, diese Methode der Window
Klasse:
Window.setAlwaysOnTop ( boolean)
Es funktioniert auf die gleiche Art und Weise wie die Standard in der Windows-Taskmanager: Umschalten auf eine andere App, aber es zeigt immer oben
.Dies wurde in Java 1.5
hinzugefügtBeispielcode:
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 );
}
}
Fenster bleibt oben, auch wenn sie nicht aktiv ist
Andere Tipps
Aus meiner Beobachtung fand ich, dass AlwaysOnTop Privileg auf das neueste Verfahren gegeben, die immer oben zu sein angefordert.
Also, wenn Sie eine Anwendung haben, die setAlwaysOnTop(true)
und später eine andere Anwendung diese Option verwendet, wird das Privileg der zweiten Anwendung gegeben. Um dies zu umgehen, ich habe die setAlwaysOnTop(false)
gesetzt und wieder setAlwaysOnTop(true)
sobald ein Fenster auf dem aktuellen Fenster kommt.
Ich habe es mit wordweb
in windows
geprüft. WordWeb ist eine der Anwendungen, die AlwaysOnTop
Option aus dem OS
verwendet
Ich bin mir nicht sicher, ob es ordnungsgemäß mit Ihrem Spiel Szenario funktioniert.
Warnung . Ich bin mir nicht bewusst, die Nebenwirkungen
Hier ist das Code-Beispiel:
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();}
}
Verwendung setFullScreenWindow nicht, nur die Bildschirmgröße und dann setSize, und alles wird gut.