Frage "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?


76
2017-11-18 05:37


Ursprung


Antworten:


Probieren Sie diese Methode der Window Klasse:

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


139
2017-11-18 05:46



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

Also, wenn Sie eine Anwendung haben, die setAlwaysOnTop(true) und später verwendet eine andere Anwendung diese Option, das Privileg wird der zweiten Anwendung gegeben. Um das zu umgehen, habe ich das eingestellt setAlwaysOnTop(false) und wieder setAlwaysOnTop(true) wenn irgendein Fenster über das aktuelle Fenster kommt.

Ich habe es mit überprüft wordweb im windows. WordWeb ist eine der Anwendungen, die verwendet werden AlwaysOnTop Option von der 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();}
    }

10
2018-01-04 16:15



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


0
2017-07-22 03:11