2009-05-17 16 views
16

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 aver reso visibile la cornice.Come chiamare setUndecorated() dopo che una cornice è stata resa 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 disattivare alcune barre del titolo.

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

Come faccio a fare questo dopo che una cornice è visibile ?.

risposta

16

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

Tuttavia, se l'intera interfaccia utente è presente in un pannello inserito nella cornice, è possibile creare una nuova cornice e aggiungere tale riquadro alla cornice. Non tanto lavoro.

Qualcosa di simile a 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); 

Nell'oscillazione un pannello (e in effetti qualsiasi istanza di un componente) può essere solo in un fotogramma alla volta, in modo che quando si aggiunge a un nuovo telaio, si è subito cessa di essere nella vecchia cornice.

+2

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

+1

Come descritto da Thomas, questo è possibile, vedi anche http://stackoverflow.com/questions/27715638/is- there-a-way-to-remove-frame-decoration-senza-re-opening-it –

2

Bene, hai 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.

+0

Questo è quello che ho considerato ma sto cercando un'alternativa. – Lucky

20

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

Se no, allora cosa si può fare è avere il telaio di una parte insignificante della classe, con solo i ganci più minime al pannello di livello più alto o più pannelli necessariamente, e basta spostare quelli per il nuovo telaio. Tutti i bambini seguiranno.

+0

Funziona per me. – dimo414

+0

Quale, gettare() o creare una nuova cornice? – Yishai

+2

Chiamare dispose() funziona per me – Annan

12

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

In Metodo switchFullscreenMode():

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

In realtà non c'è una roba molto più in corso di nascondere vari pannelli laterali che ricompaiono se il mouse tocca i lati.

Si noti inoltre che è necessario impostare in modo esplicito i limiti. Window.setExtendedState(MAXIMIZED_BOTH) interferisce in modo non corretto nelle vicinanze 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 consiglio di prendere direttamente la schermata di default:

GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice(); 

e invece utilizzare lo schermo, il vostro JFrame è attualmente in:

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

Anche se è attualmente lo stesso, potrebbe cambiare nel futuro.

+0

Questo ha funzionato perfettamente per me, ed è stato un cambiamento di codice più semplice rispetto alla creazione di nuovi frame regolarmente. I tuoi commenti sui limiti e l'uso della schermata corrente del frame sono stati particolarmente utili. Inoltre, ottengo i limiti della finestra prima di trasformarla a schermo intero, il che mi consente di ripristinarlo nella stessa posizione e dimensione quando esco dallo schermo intero. – dimo414

8

chiama dispose() rilascia le risorse della finestra nativa. quindi puoi modificare proprietà come non decorate e così via. poi basta chiamare setVisible(true) per ricreare le risorse delle finestre e tutto funziona bene (la posizione e tutte le Compoenents vinto `t essere modificate)

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

Ecco un codice a come rendere ALT +Enter entra Schermo intero senza la modalità barra e ridurre al minimo con mostra 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 
} 
-1

Prova:

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

Check it Out. Spero che ti aiuti !!

Problemi correlati