Windows "sempre in primo piano" con Java


85

In Java, esiste un modo per avere una finestra "Sempre in primo piano" indipendentemente dal fatto che l'utente sposti il ​​focus su un'altra applicazione? Ho cercato sul Web e tutte le soluzioni si appoggiano a una sorta di interfaccia JNI con collegamenti nativi. Veramente questo non può essere l'unico modo per farlo? .. o no?

Risposte:


159

Prova questo metodo della Windowclasse:

Window.setAlwaysOnTop (booleano)

Funziona allo stesso modo dell'impostazione predefinita nel TaskManager di Windows: passa a un'altra app ma viene visualizzata sempre in primo piano.

Questo è stato aggiunto in Java 1.5

Codice d'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 );
    }
}

testo alternativo

La finestra rimane in primo piano anche quando non è attiva


3
si potrebbe pensare che una semplice ricerca di "applicazione java sempre in primo piano" su avrebbe questa risposta, ma non è riuscita a trovarla. Grazie.
Laplie Anderson

46
Indovina un po. Ora lo fa !! :) Ti porta qui! google.com/search?&q=java+application+always+on+top
OscarRyz

Questo è semplice e fantastico. Stavo anche cercando qualcosa di simile, ma non sapevo che lo implementassero in Java 1.5. Grazie per aver postato.
Kushal Paudyal

2
Sfortunatamente questo non funziona per me quando eseguo un'applicazione a schermo intero come un videogioco. Qualcuno sa di un modo per forzarlo al top in quella situazione?
Dream Lane

1
@Dream lane probabilmente lo farei come nuova domanda
rogerdpack

11

Dalla mia osservazione ho scoperto che il privilegio AlwaysOnTop è dato all'ultimo processo che richiedeva 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 problema, ho impostato setAlwaysOnTop(false)e di nuovo setAlwaysOnTop(true)ogni volta che una finestra viene visualizzata in cima alla finestra corrente.

L'ho controllato con wordwebdentro windows. WordWeb è una delle applicazioni che utilizza l' AlwaysOnTopopzione dalOS

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

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

Impostarlo di nuovo su falso e vero quando viene visualizzata un'altra finestra non sembra una soluzione praticabile per un semplice motivo: cosa succede se l'altra applicazione fa la stessa cosa?
Trejkaz

@Trejkaz Bene, questo è un punto valido. Non sono più in contatto con lo swing adesso.
pinkpanther

Funziona perfettamente per il mio caso d'uso! L'impostazione di nuovo su false prima era la chiave.
rococò

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.