2010-02-15 4 views
2

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.

Répondre

7

La méthode setQueryHelperPanel() ne fonctionne pas car il supprime le panneau existant de la collection des enfants de this via la méthode remove(), mais ne puis pas utiliser add() pour ajouter le nouveau panneau - affectation à la variable d'instance ne provoque pas devenir un enfant.

Toutefois, une solution beaucoup plus propre pour votre problème serait d'utiliser un CardLayout.

0

Merci pour la réponse.

J'ai regardé CardLayout précédemment mais j'essaie de l'éviter car d'après ce que je comprends, il charge tous les panneaux en mémoire et vous permet ensuite de les échanger. Je voudrais garder le contrôle total lorsque je montre dynamiquement les panneaux. Oublier le retrait était une erreur stupide de ma part. En fait, j'avais ça plus tôt mais ça ne fonctionnait toujours pas. Ceci est la méthode d'échange en cours:

public void setQueryHelperPanel(JPanel panel){ 
    this.remove(queryHelperPanel); 
    this.queryHelperPanel=panel; 
    this.add(queryHelperPanel); 
    this.queryHelperPanel.repaint(); 
    this.validate(); 
    this.repaint(); 
} 

Je comprends que le réglage de la variable d'instance n'ajoute pas comme un enfant, mais mon idée était que la variable serait utilisée pour rappeler ce panneau pour enlever ou ajouter.

+0

Appellez-vous cette méthode dans Event Dispatch Thread? Sinon, cela peut être la raison de votre problème. – Taisin

+0

@Taisin: Sérieusement, CardLayout est la bonne façon de procéder. Vos raisons pour éviter cela n'ont pas de sens. –

+0

@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

Questions connexes