2008-11-18 9 views
75

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?Windows "siempre encendido" con Java

Respuesta

136

probar este método de la clase Window:

Window.setAlwaysOnTop(boolean)

Funciona de la misma forma que el valor por defecto en el administrador de tareas de Windows: cambiar a otra aplicación, pero se muestra siempre en la parte superior.

Esto se añadió en Java 1.5

Código de ejemplo:

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

ventana permanece en la parte superior, incluso cuando no está activo

+3

Se podría pensar que una simple búsqueda de "aplicación Java siempre en la parte superior" en la tendría esta respuesta, pero no pudo encontrarlo. Gracias. –

+39

Adivina qué. ¡Ahora sí! :) ¡Te trae aquí! http://www.google.com/search?&q=java+application+always+on+top – OscarRyz

+0

Esto es simple e impresionante. También estaba buscando algo como esto, pero no sabía que lo implementaron en Java 1.5. Gracias por publicar. –

10

Desde mi observación me encontró que el privilegio de AlwaysOnTop es g al último proceso que solicitó estar siempre en la cima.

Por lo tanto, si tiene una aplicación en la que setAlwaysOnTop(true) y más tarde otra aplicación usa esta opción, el privilegio se otorga a la segunda aplicación. Para solucionar este problema, configuré el setAlwaysOnTop(false) y nuevamente el 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 en el escenario del 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();} 
    } 
+0

Ponerlo en falso y verdadero otra vez cuando otra ventana entra en la parte superior no suena como una solución viable por una simple razón: ¿qué pasa si la otra aplicación hace lo mismo? – Trejkaz

+0

@Trejkaz Bueno, ese es un punto válido. Ya no estoy en contacto con el swing ahora. – pinkpanther

+0

¡Esto funciona perfectamente para mi caso de uso! Volver a establecerlo en falso primero fue la clave. – misaka

Cuestiones relacionadas