it-swarm.com.de

"Immer im Vordergrund" Windows mit Java

Gibt es in Java eine Möglichkeit, ein Fenster mit dem Status "Immer im Vordergrund" zu haben, unabhängig davon, ob der Benutzer den Fokus auf eine andere Anwendung wechselt? Ich habe das Web durchsucht und alle Lösungen neigen zu einer Art JNI-Schnittstelle mit nativen Bindungen. Wirklich, das kann nicht der einzige Weg sein, es zu tun.

78
Laplie Anderson

Versuchen Sie diese Methode der Window-Klasse:

Window.setAlwaysOnTop (Boolean)

Es funktioniert genauso wie die Standardeinstellung im Windows TaskManager: Wechseln Sie zu einer anderen App, die jedoch immer oben angezeigt wird.

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 oben, auch wenn es nicht aktiv ist

146
OscarRyz

Aus meiner Beobachtung habe ich herausgefunden, dass das AlwaysOnTop-Privileg dem neuesten Prozess eingeräumt wird, bei dem es immer darum ging, immer oben zu sein.

Wenn Sie also eine Anwendung haben, die setAlwaysOnTop(true) und später eine andere Anwendung diese Option verwendet, wird der zweiten Anwendung das Recht erteilt. Um dies zu umgehen, habe ich setAlwaysOnTop(false) und erneut setAlwaysOnTop(true) gesetzt, wenn ein Fenster über dem aktuellen Fenster angezeigt wird.

Ich habe es mit wordweb in windows geprüft. WordWeb ist eine der Anwendungen, die die AlwaysOnTop-Option von der OS verwendet.

Ich bin nicht sicher, ob es in Ihrem 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();}
    }
10
pinkpanther

verwenden Sie nicht setFullScreenWindow, rufen Sie einfach die Bildschirmgröße und dann setSize auf.

0
X.Zhang