Comment puis-je changer un Composite à l'intérieur d'une JFrame à la volée?
Pour faire simple, il y a un simple java swing application qui se compose de JFrame avec quelques éléments en elle. L'un des composants est un Composite qui est destiné à être remplacé par un autre Composite sur action de l'utilisateur.
Alors, quelle est la façon correcte de faire une telle chose? J'ai essayé
panel = new CustomJPanelWithComponentsOnIt();
parentFrameJPanelBelongsTo.pack();
mais cela ne fonctionne pas. Que suggérez-vous?
Vous devez vous connecter pour publier un commentaire.
Votre cas d'utilisation, tout semble parfait pour CardLayout.
Dans la mise en carte, vous pouvez ajouter plusieurs panneaux dans le même lieu, mais ensuite d'afficher ou de masquer, un panneau à la fois.
1) le premier Panneau:
2)Remplacement du panneau:
Notez également que vous devez le faire dans le Cas du Fil, pour assurer cela, utilisez la SwingUtilities.invokeLater ou la SwingWorker
Rappelez-vous, Java utiliser " copier la référence par la valeur de l'argument de passage. Afin de modifier une variable habitude de modifier les copies de la référence transmise à d'autres méthodes.
Noter également
JFrame
est très déroutant au nom de la convivialité. L'ajout d'un composant ou d'un paramètre de mise en page (généralement) effectue l'opération sur le volet de contenu. Curieusement, l'obtention de la mise en page vous donne vraiment l'image du gestionnaire de présentation.Espère que ce morceau de code vous donner une idée de l'évolution des jPanels à l'intérieur d'une JFrame.
Sur l'action de l'utilisateur:
//que vous avez à faire quelque chose le long des lignes de
Ensuite, vous pouvez redimensionner votre wndow en tant que de besoin.
Tout dépend de comment sa va être utilisé. Si vous souhaitez basculer entre ces deux panneaux, puis utilisez un CardLayout. Si vous êtes seulement de passage de la première à la deuxième fois et (et non pas à l'arrière) alors je voudrais utiliser telcontarla suggestion et simplement le remplacer. Si le Composite n'est pas la seule chose dans votre cadre, je voudrais utiliser
supprimer(java.awt.Composant) au lieu de removeAll.
Si vous êtes quelque part entre ces deux cas, c'est en fait un espace-temps du compromis. Le CardLayout, vous gagnerez du temps, mais prendre plus de mémoire par avoir à garder toute cette autre panneau dans la mémoire à tout moment. Mais si vous venez de remplacer le panneau cas de besoin et de le construire à la demande, vous n'avez pas à garder cette meory autour, mais cela prend plus de temps pour passer.
Vous pouvez également essayer un JTabbedPane utiliser les onglets à la place (c'est même plus facile que CardLayout car il gère l'affichage/masquage des automitically)
Les autres personnes a répondu à la question. Je veux vous suggérons d'utiliser un JTabbedPane au lieu de remplacer le contenu. En règle générale, il est mauvais d'avoir des éléments visuels de votre application disparaître ou être remplacé par un autre contenu. Il y a certainement des exceptions à chaque règle, et uniquement à vous et à votre communauté d'utilisateurs peuvent décider de la meilleure approche.
Problème: Mon composant n'apparaît pas après que j'ai ajouté au conteneur.
Vous avez besoin d'invoquer revalider et repeindre après l'ajout de un composant avant de montrer dans votre conteneur.
Source: http://docs.oracle.com/javase/tutorial/uiswing/layout/problems.html
J'ai eu exactement le même problème!!!!! Increadible!! La solution que j'ai trouvé est:
spectacle.
Pas revalidate(), pas de valider(), pas de CardLayout nécessaire.
La mise en page.replace() réponse n'existe/fonctionne sur le GroupLayout Manager.
Autres LayoutManagers (CardLayout, BoxLayout etc) ne prennent PAS en charge cette fonctionnalité, mais vous obliger à première RemoveLayoutComponent( et puis AddLayoutComponent( retour à nouveau. 🙂 [Juste mettre les pendules à l']
Je vous suggère d'ajouter à la fois le panneau à l'image de la création, puis changer le visible panneau en appelant setVisible(true/false) sur les deux.
Lors de l'appel de setVisible, les parents seront informés et invités à les repeindre.
Parfois, vous pouvez faire le travail sans l'aide de la revalidation et parfois sans l'aide de la repeindre.Je conseille d'utiliser les deux.
Il suffit d'appeler la méthode pack() après le réglage de la
ContentPane
, (java 1.7
, peut-être plus) comme ceci:vous pouvez utiliser le remplacement de la méthode de mise en page:
existants et de nouveaux composants peuvent être JPanels, trop.