Configuración de un JFrame sin superposición con la barra de tareas

Necesito tener un JFrame no decorado ( setUndecorated (true) ) que deba mostrarse en pantalla completa, sin superponerse con la barra de tareas.

He intentado las siguientes soluciones.

  • Llamando a setExtendedState (MAXIMIZED_BOTH).

    • Ventaja : esto funciona bien como se esperaba, es decir, la ventana se está ajustando dinámicamente, excepto que tiene los siguientes problemas.
    • Problemas Inicialmente, la ventana ocupa la pantalla completa. Aunque el marco se ajusta de forma dinámica, se superpone con la barra de tareas.
  • Probé la siguiente solución como se indica en ¿Funciona JFrame.setExtendedState (MAXIMIZED_BOTH) con marcos no decorados?

    GraphicsConfiguration config = aFrame.getGraphicsConfiguration(); Rectangle usableBounds = SunGraphicsEnvironment.getUsableBounds(config.getDevice()); aFrame.setBounds(0, 0, usableBounds.width, usableBounds.height); 
    • Ventaja : no me estoy superponiendo y la ventana se ve bien.
    • Problema : la ventana no se ajusta dinámicamente cuando se cambia la posición / tamaño de la barra de tareas.

Cualquier ayuda sería muy apreciada.

Pensé en un diseño. Pero no estoy seguro de su viabilidad. Puedo usar el setBounds (). Pero luego necesito que se notifique mi marco cuando la barra de tareas se ajusta o cambia de posición. ¿Hay alguna manera?

Capaz de poder solucionar el problema anterior con el siguiente código,

 Rectangle usableBounds = SunGraphicsEnvironment.getUsableBounds(config.getDevice()); setMaximizedBounds(usableBounds); setExtendedState(MAXIMIZED_BOTH); 

Entonces, por getUsableBounds puedo obtener los límites saliendo de la barra de tareas. Y, por lo tanto, estoy usando setExtendedState(MAXIMIZED_BOTH) La ventana se actualiza automáticamente cuando redimensiono / reposiciono la barra de tareas. 🙂

 final Point x = GraphicsEnvironment.getLocalGraphicsEnvironment().getCenterPoint(); 

Tener un hilo separado para comprobar si la barra de tareas se modifica. Si es así actualizar el tamaño

 new Thread(new Runnable() { @Override public void run() { if (x.equals(GraphicsEnvironment.getLocalGraphicsEnvironment().getCenterPoint())) { Rectangle r = GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds(); setSize(r.getSize()); } try { Thread.sleep(5000); } catch (InterruptedException ex) { Logger.getLogger(NewJFrame.class.getName()).log(Level.SEVERE, null, ex); } } }).start();