2009-05-17 10 views
16

En mi aplicación Swing, quiero la capacidad de cambiar entre decorado y sin decoración sin volver a crear todo el encuadre. Sin embargo, la API no me permite llamar al setUndecorated() después de que el marco se hace visible.Cómo llamar a setUndecorated() después de que un marco se hace visible?

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

Estoy haciendo una aplicación de pantalla completa que se puede cambiar entre 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 ?.

Respuesta

16

No puede. Esa ha sido mi experiencia cuando traté de lograr lo mismo.

Sin embargo, si tiene toda la 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 Columpio un panel (y de hecho cualquier instancia de un componente) sólo puede estar en un cuadro a la vez, por lo que al añadirlo a un nuevo marco, inmediatamente deja de estar en el viejo marco.

+2

llamando a 'dispose() 'libera los recursos de la ventana nativa. luego puede editar propiedades como sin decoración, etc. con 'pack()' se recrean los recursos de la ventana. entonces simplemente llame a 'setVisible (true)' y todo funciona bien (la posición y todos los componentes no serán cambiados) – Thomas

+1

Como Thomas describió, esto es posible, vea también http://stackoverflow.com/questions/27715638/is- there-a-way-to-remove-frame-decoration-without-re-opening-it –

2

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.

+0

Eso es lo que he considerado pero estoy buscando una alternativa. – Lucky

20

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

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

+0

Funciona para mí. – dimo414

+0

¿Cuál de ellos, desecha() o crea un nuevo marco? – Yishai

+2

Llamar a disponer() funciona para mí – Annan

12

Tenga una mirada en https://tvbrowser.svn.sourceforge.net/svnroot/tvbrowser/trunk/tvbrowser/src/tvbrowser/ui/mainframe/MainFrame.java

En el Método switchFullscreenMode():

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

En realidad hay mucha más materia que se encienden para ocultar varios paneles laterales que reaparecen si el ratón toca los lados.

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

No recomiendo tomar directamente la pantalla por defecto:

GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice(); 

y en lugar de utilizar la pantalla, su JFrame se encuentra actualmente en:

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

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

+0

Esto funcionó perfectamente para mí, y fue un cambio de código más simple que crear nuevos marcos regularmente. Sus comentarios sobre límites y el uso de la pantalla actual del marco fueron especialmente útiles. Además, obtengo los límites de la ventana antes de convertirla a pantalla completa, lo que me permite restaurarla a la misma ubicación y tamaño cuando salgo de la pantalla completa. – dimo414

8

llamando al dispose() libera los recursos de la ventana nativa. luego puede editar propiedades como sin decoración, etc. a continuación, sólo llamar setVisible(true) para recrear los recursos de la ventana y todo funciona bien (la posición y todos Compoenents `t ser cambiados)

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

Aquí hay un código en cómo hacer ALT +Introduzca entra en pantalla completa sin el modo de barra y minimizar con mostrar 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 
} 
-1

Probar:

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

Compruébalo. Espero que ayude !!

Cuestiones relacionadas