java swing fullscreen

java - jframe fullscreen netbeans



¿Cómo llamar a setUndecorated() después de hacer visible un marco? (7)

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

Incluso si llamo setVisible(false) , isDisplayable() todavía devuelve verdadero. La API dice que la única manera de hacer que un marco no se pueda mostrar es volver a crearlo. Sin embargo, no quiero volver a crear el marco 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 de ventana; Debe poder cambiar mientras se mantiene el estado, etc.

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


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

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


Aquí hay un código sobre cómo hacer que ALT + Enter ingrese 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 }


Bueno, vas a necesitar una instancia de frame 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.


Eche un vistazo a 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 muchas más cosas que ocultan varios paneles laterales que vuelven a aparecer 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 proximidad oportuna de dispose (), porque ambos se basan en 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 por defecto directamente:

GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();

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

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

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


Tratar:

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

Echale un vistazo. Espero que te ayude !!


Usted no puede Esa ha sido mi experiencia cuando intenté lograr lo mismo.

Sin embargo, si tiene su IU completa 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 cuadro a la vez, por lo que cuando lo agrega a un cuadro nuevo, inmediatamente deja de estar en el cuadro anterior.


llamar a dispose() libera los recursos de ventana nativos. Luego puedes editar propiedades como sin decorar y así sucesivamente. luego simplemente llame a 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);