J'ai un objet simple qui s'étend code> jPanel code>, lorsque la méthode update () code> est appelée sur cet objet, cela signifiait ajouter des étiquettes au panneau, puis repeindre . Cependant, les étiquettes ne s'affichent pas après l'appel de la méthode de mise à jour, ci-dessous est le code de mise à jour:
public void update(){
GridBagConstraints constraints = new GridBagConstraints();
if(cardsHidden){
for(int i = 0; i < 2; i++){
constraints.gridx = i;
constraints.gridy = 0;
JLabel card = new JLabel(PlayingCards.cardImages[PlayingCards.CARD_BACK_INDEX]);
add(card, constraints);
}
}
else{
Card[] holeCards = player.getHoleCards();
for(int i = 0; i < holeCards.length; i++){
constraints.gridx = i;
constraints.gridy = 0;
JLabel card = new JLabel(holeCards[i].getImageIcon());
add(card, constraints);
}
}
validate();
repaint();
}
6 Réponses :
Avez-vous essayé SetVisible () sur les étiquettes? P>
Avez-vous essayé d'ajouter les objets à l'initialisation sans aucune mise à jour? S'ils ne se présentent pas là-bas, ils ne se présenteront jamais. P>
D'accord. Personnellement, je suis en désaccord avec le bowvote. Les gens oublient généralement des choses simples comme celle-ci et cela peut résoudre le problème de quelqu'un d'autre.
Les composants Java ne sont-ils pas visibles par défaut sur la création?
Oui. Mais je ne connais pas le reste du code. Quand une personne mentionne une composante qui ne se présente pas, SetVisible me vient à l'esprit. Ce n'est peut-être pas la solution au problème de 95% des personnes qui recherchent une réponse à leur propre problème similaire, mais pour les autres personnes de 5% qui seront sur ce site, à cette question même, cela le résoudra. Si j'aurais dit "Vous êtes-vous assuré que votre écran est allumé?" J'aurais d'accord avec un bowvote;)
Ne disant pas que le bowvote était digne, juste qu'il ajoute clairement les contrôles du code ci-dessus, car il vient de les avoir créés, ils doivent être mis à l'ordre (vrai).
essayez d'appeler revalidate (); Reper n'est pas ce que vous voulez. P>
Selon: P>
API DOCS P>
Remarque: Si un composant a été ajouté à un conteneur qui a été affiché, Valider doit être appelé sur cela conteneur pour afficher le nouveau composant. Si plusieurs composants sont être ajouté, vous pouvez améliorer Efficacité en appelant uniquement une fois, après que tous les composants ont été ajouté. p> blockQuote>
revalidate () est fondamentalement une invalidation () suivie d'une validate (). P>
voir Cette question ..... p >
Je viens d'essayer de supprimer la déclaration Repaint () et de changer de validation () à revalidate () mais pas de chance :(
Appelez-vous la mise à jour à partir d'un autre fil ou du fil d'expédition d'événement?
Je demande la mise à jour directement à partir d'un autre objet en cours d'exécution sur un thread standard.
Oh, plus loin ... Appelez le revalidate sur le jframe propriétaire, pas le JPANEL! Je pensais juste à ça.
Jframe n'a pas de méthode 'revalidate ()'
Pour Jframe Validate est correct. Si cela ne fonctionne pas, essayez d'invalider d'abord.
L'appel à Valider () Code>
devrait fonctionner, bien que revalidate () code>
peut être suffisant; repeindre () code >
ne devrait pas être nécessaire. Vous pouvez comparer ce que vous faites à cette exemple qui fait dynamique gridbaglayout code >. p>
Vous pouvez essayer d'appeler updateui () code> méthode. p>
Cela dépend de ce que vous voulez arriver et des responsables de la mise en page utilisent, mais les règles de base sont les suivantes:
Assurez-vous que appel appel En outre, appeler la validation sur un composant de niveau supérieur (JWindow, JDialog, JFrame) ne redimension pas nécessairement que le composant. Pour que cela se produise, vous devrez appeler Si vos modifications modifient la taille ou la position des conteneurs, les conteneurs redimensionnés repeindre, mais ils n'effaceront pas l'espace le utilisé pour que em> occupent. Appelant Mise à jour code> est appelé sur l'EDT. Si ce n'est pas (
swingutieux.iseventdispatterthread () code> renvoie false) Vous devrez utiliser
oscillabilité.invokelater code> pour planifier la mise à jour sur l'EDT. Par exemple: p>
invalidate () code>. La plupart des choses qui changent un composant le feront pour vous. Il suffit donc d'appeler ceci si ce qui suit ne fonctionne pas seul. P> Li>
valide () code> sur le composant em> le plus élevé em>. C'est probablement le bit du cycle de rendu de Java. L'appel à
Invalidate code> marque le composant et tous ses ancêtres em> comme besoin de mise en page. L'appel à
Valider code> exécute la disposition du composant et de tous ses descendants em>. On travaille "Up" et les autres œuvres "Down". Vous devez appeler
Valider code> sur le composant le plus élevé de l'arborescence qui sera affectée par votre changement. P>
pack () code> ou
setsize () code>. P> li>
repeindre () code> sur le parent du conteneur le fera repeindre l'arrière-plan, corriger les dommages. P> li>
ol> p>
Où puis-je trouver une bonne ressource qui discute de toutes ces règles? Le Javadoc n'est pas explicite de tout ce que vous avez écrit ci-dessus. Il y a sûrement une meilleure ressource ...?
Il s'avère que le HolecardsPanel Code> ne s'ajoute pas correctement à son cadre parent, une fois que cela a été corrigé l'ajout de nouveaux
jlabels code> fonctionne bien. J'ai ajouté l'appel à la méthode
Mettre à jour () Code> sur le thread d'expédition code> Utilisation de
Swingutillities.Invokelater CODE> J'ai dû appeler
valider () code> à partir du composant supérieur (dans ce cas, le
jframe code>) p>
Envisagez d'ajouter ces résultats à votre question pour une référence future.