Question

Dans mon application Swing, je veux la possibilité de basculer entre la décoration et undecorated sans recréer l'image entière. Cependant, l'API ne me laisse pas appeler setUndecorated() après que le cadre est visible.

Même si je l'appelle setVisible(false), isDisplayable() retourne toujours vrai. L'API dit que la seule façon de faire un cadre non-affichable est de recréer. Cependant, je ne veux pas recréer le cadre juste pour couper quelques barres de titre.

Je fais une application en plein écran qui peut être commuté entre les modes plein écran et fenêtré; Il devrait être en mesure de changer tout en maintenant l'état, etc.

Comment puis-je faire après un cadre est visible?.

Était-ce utile?

La solution

Vous ne pouvez pas. Cela a été mon expérience quand j'ai essayé d'obtenir le même.

Toutefois, si vous avez votre interface entière dans un panneau qui est dans votre cadre, vous pouvez créer un nouveau cadre et ajouter ce panneau au cadre. Pas beaucoup de travail.

Quelque chose comme ceci:

// 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 panneau (et en fait une instance d'un composant) ne peut être dans un cadre à la fois, donc quand vous ajoutez à un nouveau cadre, il cesse immédiatement d'être dans l'ancien cadre.

Autres conseils

Avez-vous essayé d'appeler Frame.dispose() puis changer? N'a pas essayé moi-même, mais il pourrait fonctionner.

Si non, alors ce que vous pouvez faire est d'avoir le cadre d'une partie de la classe sans conséquence, avec seulement les crochets les plus minimes au panneau de haut niveau ou des panneaux nécessairement, et il suffit de déplacer ceux du nouveau cadre. Tous les enfants suivront.

Jetez un oeil à https://tvbrowser.svn.sourceforge.net/svnroot/tvbrowser/trunk/tvbrowser/src/tvbrowser/ui/mainframe/MainFrame.java

Dans le procédé switchFullscreenMode():

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

En fait, il y a beaucoup plus de choses en cours pour cacher différents panneaux latéraux qui réapparaîtra si la souris touche les côtés.

Notez également que vous devez définir explicitement les limites. Window.setExtendedState(MAXIMIZED_BOTH) interfère mal à proximité en temps opportun de disposer (), parce qu'ils reposent tous deux sur plusieurs événements natifs du système d'exploitation, qui sont perdus, si la fenêtre ne sera affichable à cette fraction de seconde.

Je ne recommande pas de prendre l'écran par défaut directement:

GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();

et utiliser à la place de l'écran, votre JFrame est actuellement sur:

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

Bien qu'il soit actuellement le même, il pourrait changer à l'avenir.

appelant dispose() libère les ressources de fenêtre natifs. alors vous pouvez modifier les propriétés comme undecorated et ainsi de suite. puis il suffit d'appeler setVisible(true) pour recréer les ressources de la fenêtre et tout fonctionne très bien (la position et tous compoenents gagné le `t être modifiés)

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

Eh bien, vous allez avoir besoin d'autre instance de cadre. Vous pourrez peut-être déplacer le contenu de votre cadre sans recréer sur cela. La clé ici est de rendre votre code ne doit pas dépendre d'un cadre spécifique. Ceci est une bonne pratique de base dans tous les cas.

Essayez:

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

Check it out. Espérons que cela vous aidera !!

Voici un code dans la façon de faire ALT + Entrée pénètre plein écran sans le mode bar et Minimisez avec montrant la barre de titre et la barre de démarrage:

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
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top