Domanda

In Java, c'è un modo per avere una finestra che è " Sempre in primo piano " a prescindere se l'utente passa a un'altra applicazione? Ho cercato sul Web e tutte le soluzioni si basano su una sorta di interfaccia JNI con collegamenti nativi. Davvero questo non può essere l'unico modo per farlo? ... o è?

È stato utile?

Soluzione

Prova questo metodo della classe Window :

Window.setAlwaysOnTop ( booleano)

Funziona allo stesso modo del predefinito nel TaskManager di Windows: passa a un'altra app ma mostra sempre in primo piano.

È stato aggiunto in Java 1.5

Codice di esempio:

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

La finestra rimane in primo piano anche quando non è attiva

Altri suggerimenti

Dalla mia osservazione ho scoperto che il privilegio AlwaysOnTop è assegnato all'ultimo processo che ha richiesto di essere sempre in primo piano.

Quindi, se si dispone di un'applicazione che setAlwaysOnTop (true) e successivamente un'altra applicazione utilizza questa opzione, il privilegio viene assegnato alla seconda applicazione. Per ovviare a questo ho impostato setAlwaysOnTop (false) e ancora setAlwaysOnTop (true) ogni volta che una finestra si trova sopra la finestra corrente.

L'ho controllato con wordweb in windows . WordWeb è una delle applicazioni che utilizza l'opzione AlwaysOnTop dall'opzione OS

Non sono sicuro che funzioni correttamente con il tuo scenario di gioco.

Avviso : non sono a conoscenza degli effetti collaterali.

Ecco l'esempio di codice:

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();}
    }

non usare setFullScreenWindow, basta ottenere le dimensioni dello schermo e quindi setSize, e tutto andrà bene.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top