“Siempre en la cima” Windows con Java

En Java, ¿hay alguna manera de tener una ventana que esté “Siempre al tope” independientemente de si el usuario cambia el foco a otra aplicación? He buscado en la web y todas las soluciones se basan en algún tipo de interfaz JNI con enlaces nativos. ¿Verdaderamente esta no puede ser la única forma de hacerlo? … ¿o no?

Pruebe este método de la clase Window :

Window.setAlwaysOnTop (booleano)

Funciona de la misma manera que el predeterminado en el Administrador de tareas de Windows: cambiar a otra aplicación, pero siempre se muestra en la parte superior.

Esto fue agregado en Java 1.5

Código de muestra:

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

texto alternativo

La ventana permanece en la parte superior incluso cuando no está activa

Según mi observación, descubrí que el privilegio de AlwaysOnTop se otorga al último proceso que solicitó estar siempre al tope.

Por lo tanto, si tiene una aplicación que setAlwaysOnTop(true) y más tarde otra aplicación utiliza esta opción, el privilegio se otorga a la segunda aplicación. Para setAlwaysOnTop(false) este problema, he establecido setAlwaysOnTop(false) y de nuevo setAlwaysOnTop(true) cada vez que aparece una ventana encima de la ventana actual.

Lo he comprobado con wordweb en windows . WordWeb es una de las aplicaciones que usa la opción AlwaysOnTop del OS

No estoy seguro de si funciona correctamente con tu escenario de juego.

Advertencia : no estoy al tanto de los efectos secundarios.

Aquí está el ejemplo del código:

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

No use setFullScreenWindow, simplemente obtenga el tamaño de la pantalla y luego configure Size, y todo estará bien.