¿Cómo llamar a setUndecorated() después de que un marco se haga visible?

4 minutos de lectura

avatar de usuario
Afortunado

En mi aplicación Swing, quiero la capacidad de cambiar entre decorado y sin decorar sin recrear todo el marco. Sin embargo, la API no me deja llamar setUndecorated() después de que el marco se hace visible.

Incluso si llamo setVisible(false), isDisplayable() todavía devuelve verdadero. La API dice que la única forma de hacer que un marco no se pueda mostrar es volver a crearlo. Sin embargo, no quiero recrear el marco solo para desactivar algunas barras de título.

Estoy creando una aplicación de pantalla completa que se puede cambiar entre los modos de pantalla completa y ventana; Debería poder cambiar mientras se mantiene el estado, etc.

¿Cómo hago esto después de que un marco es visible?

avatar de usuario
Yishai

¿Has intentado llamar Frame.dispose() y luego cambiarlo? No lo he probado yo mismo, pero podría funcionar.

De lo contrario, lo que puede hacer es hacer que el marco sea una parte intrascendente de la clase, con solo los ganchos mínimos en el panel o paneles de nivel más alto necesariamente, y simplemente moverlos al nuevo marco. Todos los niños seguirán.

  • es una solución asombrosa y simple, muchas gracias, hice esto dispose(); ‘establecerSindecorar(verdadero); setExtendedState(JFrame.MAXIMIZED_BOTH); setVisible(verdadero);’

    -maq

    8 dic 2014 a las 20:02


  • Esta debería ser la respuesta aceptada, ya que no crea un nuevo JFrame cada vez.

    – PaulProgrammerNoob

    13 de marzo de 2017 a las 20:09

avatar de usuario
Steve McLeod

no puedes Esa ha sido mi experiencia cuando traté de lograr lo mismo.

Sin embargo, si tiene toda su interfaz de usuario en un panel que está en su marco, puede crear un nuevo marco y agregar ese panel al marco. No tanto trabajo.

Algo como esto:

// to start with
JPanel myUI = createUIPanel();
JFrame frame = new JFrame();
frame.add(myUI);

// .. and later ...

JFrame newFrame = new JFrame();
newFrame.setUndecorated();
newFrame.add(myUI);

En Swing, un panel (y, de hecho, cualquier instancia de un componente) solo puede estar en un marco a la vez, por lo que cuando lo agrega a un nuevo marco, inmediatamente deja de estar en el marco anterior.

  • vocación dispose() libera los recursos de la ventana nativa. luego puede editar propiedades como sin decoración, etc. con pack() usted recrea los recursos de la ventana. entonces solo llama setVisible(true) y todo funciona bien (la posición y todos los componentes no se cambiarán)

    – Tomás

    5 de diciembre de 2012 a las 10:48


  • Como lo describió Thomas, esto es posible, consulte también stackoverflow.com/questions/27715638/…

    – Christian Hujer

    31 de diciembre de 2014 a las 7:10

avatar de usuario
Tomás

vocación dispose() libera los recursos de la ventana nativa. luego puede editar propiedades como sin decoración, etc. entonces solo llama setVisible(true) para recrear los recursos de la ventana y todo funciona bien (la posición y todos los componentes no se cambiarán)

dispose();
setUndecorated(true/false);
setVisible(true);

Mira esto https://tvbrowser.svn.sourceforge.net/svnroot/tvbrowser/trunk/tvbrowser/src/tvbrowser/ui/mainframe/MainFrame.java

en método switchFullscreenMode():

dispose();
...
setFullScreenWindow(...);
setUndecorated(true/false);
setBounds(mXPos, mYPos, mWidth, mHeight);
...
setVisible(true);

En realidad, están sucediendo muchas más cosas para ocultar varios paneles laterales que reaparecen si el mouse toca los lados.

También tenga en cuenta que debe establecer explícitamente los límites. Window.setExtendedState(MAXIMIZED_BOTH) interfiere gravemente en la vecindad oportuna de dispose(), porque ambos dependen de múltiples eventos nativos del sistema operativo, que se pierden, si la ventana no se puede mostrar en esa fracción de segundo.

No recomiendo tomar la pantalla predeterminada directamente:

GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();

y en su lugar use la pantalla, su JFrame está actualmente en:

setBounds(getGraphicsConfiguration().getBounds());
getGraphicsConfiguration().getDevice().setFullScreenWindow(this);

Aunque actualmente es el mismo, podría cambiar en el futuro.

avatar de usuario
Deepak Karamchandani

Tratar:

dispose();
setUndecorated(true);
setVisible(true);

Echale un vistazo. ¡Espero que ayude!

avatar de usuario
Tom Hawtin – línea de ataque

Bueno, vas a necesitar una instancia de marco diferente. Es posible que pueda mover el contenido de su marco sin volver a crearlo. La clave aquí es hacer que su código no dependa de un marco específico. Esta es una buena práctica básica en cualquier caso.

avatar de usuario
Ferrmolina

Aquí hay un código de cómo hacer alternativa + Ingresar ingresa a Pantalla completa sin el modo de barra y Minimizar mostrando la barra de título y la barra de inicio:

public class myTest extends JFrame{
 //Your codes...
     //if "ALT" key on hold and "Enter" key pressed with it
     if (evt.isAltDown() && evt.getKeyCode() == evt.VK_ENTER) {    
         //if the JFrame has Title bar
         if (isUndecorated()) {
             //this will dispose your JFrame
             dispose();
             //here to set it with no Title bar
             setUndecorated(false);
             pack();
             setLocationRelativeTo(null);
             //as you dispose your JFrame, you have to remake it Visible..
             setVisible(true);
          } else {
             dispose();
             setUndecorated(true);
             setExtendedState(MAXIMIZED_BOTH);
             setVisible(true);
        }
    }
//your codes
}

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad