Je suis en train de créer une interface utilisateur graphique Java avec le générateur d'interface graphique Netbeans. J'ai un tas de panneaux qui sont remplacés sur mon JFrame principal que l'utilisateur navigue sur l'interface graphique et une classe de contrôleur prend soin de cela. À une étape, cependant, il existe un panneau (FilterDefinitionPanel) qui contient une zone de liste déroulante ainsi qu'un panneau interne vide (QueryHelperPanel). Ce que je voudrais faire est d'échanger ce panneau intérieur avec un autre que j'ai créé (StringQueryDefinitionPanel) en fonction de ce que l'utilisateur sélectionne dans la zone de liste déroulante. Donc maintenant sous mon cas ComboBoxItemStateChanged de zone de liste déroulante de gestionnaire je ma classe de contrôleur exécuter cette méthode:Swing: affichage dynamique d'un panneau
public void selectFilterAttribute(Object item) {
/**
* Determine panel to create based on item selection. Currently always returns the same
* StringQueryDefinitionPanel.
*/
JPanel panel = this.getRequiredQueryHelperPanel(item);
/**
* Swap the placeholder QueryHelperPanel with the required one.
*/
((FilterDefinitionPanel) this.mainFrame.getMainPanel()).setQueryHelperPanel(panel);
/**
* Not sure if all of these are needed :\
*/
mainFrame.validate();
mainFrame.repaint();
mainFrame.pack();
}
C'est ce qui se passe dans la méthode de setQueryHelper de FilterDefinitionPanel:
public void setQueryHelperPanel(JPanel panel){
this.remove(queryHelperPanel);
this.queryHelperPanel=panel;
this.queryHelperPanel.repaint();
/**
* Again, not sure which refresh methods are needed...
*/
this.validate();
this.repaint();
}
Je pense actuellement ce remplace mon panneau intérieur de l'espace réservé avec ... quelque chose ..., mais le remplacement semble ne rien contenir. Je ne sais pas si c'est important, mais l'espace réservé et le panneau de remplacement ont la même taille. Je suis une sorte de nubuck swing donc tous les conseils seraient vraiment appréciés.
Appellez-vous cette méthode dans Event Dispatch Thread? Sinon, cela peut être la raison de votre problème. – Taisin
@Taisin: Sérieusement, CardLayout est la bonne façon de procéder. Vos raisons pour éviter cela n'ont pas de sens. –
@Michael Borgwardt: Je suis désolé, mais MES raisons pour éviter ??? Je ne suis pas l'auteur de la question. Personnellement, je suis d'accord avec vous, j'utiliserais la mise en page dans cette situation, mais les raisons de l'auteur sont les siennes, et je ne fais que souligner la raison possible pour laquelle le code ci-dessus ne fonctionne pas. la solution est loin d'être optimale). – Taisin