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?

War es hilfreich?

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ü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

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top