& # 8220; Sempre in primo piano & # 8221; Windows con Java
-
08-07-2019 - |
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 è?
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 );
}
}
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.