Domanda

Nella mia applicazione Swing voglio la possibilità di passare tra gusto e non decorato senza ricreare l'intera struttura. Tuttavia, l'API non consente che chiami setUndecorated() dopo il telaio è realizzato visibile.

Anche se io chiamo setVisible(false), isDisplayable() ritorna ancora vero. L'API dice che l'unico modo per fare un telaio non visualizzabile è ricreare esso. Tuttavia, non voglio ricreare la cornice appena per spegnere alcune barre del titolo.

Sto facendo un'applicazione completa screenable che può essere commutato tra le modalità con finestre a schermo intero e; Dovrebbe essere in grado di passare, pur mantenendo lo stato, ecc.

Come faccio a fare questo dopo un frame è visibile?.

È stato utile?

Soluzione

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

Comunque, se avete l'intera interfaccia utente in un pannello che è nel telaio, è possibile creare un nuovo telaio e aggiungere quel pannello al telaio. 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);

In altalena un pannello (e in effetti qualsiasi istanza di un componente) può essere solo in un fotogramma alla volta, in modo che quando si aggiunge un nuovo telaio, cessa immediatamente di essere nel vecchio telaio.

Altri suggerimenti

Hai provato a chiamare Frame.dispose() e poi cambiarlo? Non ho provato io stesso, 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.

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à c'è un più roba sacco di cose da 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 male in tempo utile prossimità di Dispose (), perché entrambi si basano su più eventi native del sistema operativo, che si perdono, dovrebbe essere la finestra non visualizzabile in quella frazione di secondo.

Non consiglio di prendere direttamente la schermata di default:

GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();

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

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

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

chiamando dispose() rilascia le risorse delle finestre native. quindi è possibile modificare le proprietà come non decorato 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);

Bene, si sta andando ad avere bisogno di diversa istanza telaio. Si può essere in grado di spostare il contenuto del telaio sopra senza ricreare quella. La chiave qui è quello di rendere il codice non essere affidamento su un frame specifico. Questa è una buona pratica di base in ogni caso.

Prova:

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

Check it out. Spero che vi aiuterà !!

Ecco un codice a come rendere ALT + Invio entra a schermo intero senza la modalità di bar e di 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
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top