Windows “siempre visible” con Java

3 minutos de lectura

Windows "siempre visible" con Java
laplie anderson

En Java, ¿hay alguna manera de tener una ventana que esté “siempre visible” independientemente de si el usuario cambia el enfoque 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 sí?

Windows "siempre visible" con Java
oscarryz

Pruebe este método de la Window clase:

Window.setAlwaysOnTop(booleano)

Funciona de la misma manera que el predeterminado en el Administrador de tareas de Windows: cambie 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

  • uno pensaría que una simple búsqueda de “aplicación java siempre en la parte superior” tendría esta respuesta, pero no pudo encontrarla. Gracias.

    –Laplie Anderson

    18 de noviembre de 2008 a las 14:21

  • Adivina qué. ¡¡Ahora lo hace!! 🙂 Te trae aquí! google.com/search?&q=java+aplicación+siempre+en+arriba

    – OscarRyz

    15 oct.

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

    – Kushal Paudyal

    18 de noviembre de 2009 a las 22:43

  • Lamentablemente, esto no me funciona cuando ejecuto una aplicación de pantalla completa, como un videojuego. ¿Alguien sabe de una manera de forzarlo a la cima en esa situación?

    – Camino de los sueños

    05 may.

  • @Dream lane Probablemente haría eso como una nueva pregunta

    – rogerdpack

    13 mayo 2011 en 13:27

A partir 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 le da a la segunda aplicación. Para evitar esto, he configurado el setAlwaysOnTop(false) y otra vez setAlwaysOnTop(true) cada vez que cualquier ventana aparece en la parte superior de la ventana actual.

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

No estoy seguro de si funciona correctamente con el escenario de tu 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();}
    }

  • Establecerlo en falso y verdadero nuevamente cuando otra ventana aparece en la parte superior no parece una solución viable por una simple razón: ¿qué sucede si la otra aplicación hace lo mismo?

    – Hakanai

    13 abr.

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

    – Pantera Rosa

    13 abr.

  • ¡Esto funciona perfectamente para mi caso de uso! Establecerlo de nuevo en falso primero fue clave.

    – rococó

    20 nov.

no use setFullScreenWindow, solo obtenga el tamaño de la pantalla y luego setSize, y todo estará bien.

  • ¿Es una respuesta o un comentario?

    – Científico fallido

    22 jul.

  • @FailedScientist un comentario glorificado

    – clankill3r

    14 nov. 19 a las 15:08

.

¿Ha sido útil esta solución?