En Java, ¿hay alguna manera de tener una ventana que esté "Siempre visible" sin importar 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 manera de hacerlo? ... ¿o no?
java
user-interface
swing
awt
Laplie Anderson
fuente
fuente
De mi observación, descubrí que el privilegio AlwaysOnTop se otorga al último proceso que solicitó estar siempre en la parte superior.
Entonces, si tiene una aplicación que
setAlwaysOnTop(true)
y luego otra aplicación usa esta opción, el privilegio se otorga a la segunda aplicación. Para solucionar este problema, configurésetAlwaysOnTop(false)
y de nuevosetAlwaysOnTop(true)
cada vez que aparezca una ventana en la parte superior de la ventana actual.He comprobado con
wordweb
enwindows
. WordWeb es una de las aplicaciones que utiliza laAlwaysOnTop
opción delOS
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 de 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();} }
fuente
no use setFullScreenWindow, solo obtenga el tamaño de la pantalla y luego setSize, y todo estará bien.
fuente