Come chiamare setUndecorated () dopo che una cornice è stata resa visibile?

Nella mia applicazione Swing, voglio la possibilità di passare da decorata a non decorata senza ricreare l’intero fotogramma. Tuttavia, l’API non mi consente di chiamare setUndecorated() dopo che il frame è stato reso visibile.

Anche se chiamo setVisible(false) , isDisplayable() restituisce ancora true. L’API dice che l’unico modo per rendere non-visualizzabile una cornice è di ricrearlo. Tuttavia, non voglio ricreare la cornice solo per distriggersre alcune barre del titolo.

Sto facendo un’applicazione a schermo intero che può essere commutata tra modalità a schermo intero e windows; Dovrebbe essere in grado di cambiare mantenendo lo stato, ecc.

Come posso fare dopo che una cornice è visibile?

Non puoi Questa è stata la mia esperienza quando ho cercato di ottenere lo stesso risultato.

Tuttavia, se hai un’intera UI in un pannello che si trova nella cornice, puoi creare una nuova cornice e aggiungere quel riquadro alla cornice. Non tanto lavoro.

Qualcosa come questo:

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

In Swing un pannello (e in effetti qualsiasi istanza di un componente) può essere solo in un fotogramma alla volta, quindi quando lo aggiungi a un nuovo fotogramma, cessa immediatamente di essere nel vecchio fotogramma.

Hai provato a chiamare Frame.dispose() e quindi modificarlo? Non l’ho provato da solo, ma potrebbe funzionare.

In caso contrario, ciò che si può fare è avere il frame una parte irrilevante della class, con solo i ganci più minimali per il pannello oi pannelli di livello più alto, e spostarli semplicemente nel nuovo frame. Tutti i bambini seguiranno.

Dai un’occhiata a https://tvbrowser.svn.sourceforge.net/svnroot/tvbrowser/trunk/tvbrowser/src/tvbrowser/ui/mainframe/MainFrame.java

Nel metodo switchFullscreenMode() :

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

In realtà ci sono molte cose in più che nascondono vari pannelli laterali che riappaiono se il mouse tocca i lati.

Si noti inoltre che è necessario impostare in modo esplicito i limiti. Window.setExtendedState(MAXIMIZED_BOTH) interferisce male nelle vicinanze puntuali di dispose (), poiché entrambi si basano su più eventi nativi del sistema operativo, che vengono persi, nel caso in cui la finestra non sia visualizzabile in quella frazione di secondo.

Non è consigliabile prendere direttamente la schermata predefinita:

 GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice(); 

e invece usa lo schermo, il tuo JFrame è attualmente attivo:

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

Sebbene al momento sia lo stesso, potrebbe cambiare in futuro.

chiamando dispose() rilascia le risorse della finestra nativa. quindi puoi modificare proprietà come non decorate e così via. quindi chiama semplicemente setVisible(true) per ricreare le risorse della finestra e tutto funziona correttamente (la posizione e tutti i componenti non saranno modificati)

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

Bene, avrai bisogno di istanze di fotogrammi diverse. Potresti riuscire a spostare il contenuto della cornice senza ricreare quello. La chiave qui è di rendere il tuo codice non dipendente da un frame specifico. Questa è una buona pratica di base in ogni caso.

Provare:

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

Controlla. Spero che ti aiuti !!

Ecco un codice su come fare ALT + Enter entra a pieno schermo senza la modalità barra e minimizza con la barra del titolo e la barra di avvio:

 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 }