2008-10-04 5 views
10

J'essaie de rentrer dans Java (ça fait quelques années). Je n'ai jamais vraiment fait de codage GUI en Java. J'ai utilisé Netbeans pour commencer avec ça. Lorsque j'utilise winforms en C# au travail, j'utilise un usercontrols pour construire des parties de mon interface utilisateur et les ajouter dynamiquement aux formulaires.Comment ajouter dynamiquement des panneaux à d'autres panneaux lors de l'exécution en Java?

J'ai essayé d'utiliser JPanels comme les contrôles usuels en C#. J'ai créé un formulaire JPanel appelé BlurbEditor. Cela a quelques contrôles simples à ce sujet. J'essaye de l'ajouter à un autre panneau pendant l'exécution sur un événement de bouton.

Voici le code que je pensais travaillerait:

mainPanel.add(new BlurbEditor()); 
mainPanel.revalidate(); 
//I've also tried all possible combinations of these too 
//mainPanel.repaint(); 
//mainPanel.validate(); 

Ceci est malheureusement ne fonctionne pas. Qu'est-ce que je fais mal?

Répondre

17

Je l'ai compris. Les commentaires sous la réponse acceptée ici expliquent: Dynamically added JTable not displaying

En gros Je viens d'ajouter ce qui suit avant le mainPanel.add()

mainPanel.setLayout(new java.awt.BorderLayout()); 
-1

Essayez mainPanel.invalidate() puis, si nécessaire, mainPanel.validate(). Il peut également être utile de vérifier que vous faites cela dans le fil d'expédition de l'événement, sinon vos résultats seront inégaux et (généralement) non déterministes.

+0

Ajout de l'appel de méthode invalidate n'a pas aidé. Je l'appelle à partir de l'événement mouseclick généré par netbeans. – BFreeman

0

Comme tout le code de swing, ne pas oublier d'appeler une IUG mise à jour dans le fil d'expédition de l'événement. Voir this pourquoi vous devez faire des mises à jour comme ce

// Do long running calculations and other stuff outside the event dispatch thread 
while (! finished) 
    calculate(); 
SwingUtilities.invokeLater(new Runnable(){ 
    public void run() { 
    // update gui here 
    } 
} 
5

composants ont généralement Swing/AWT d'avoir une mise en page avant d'ajouter des choses pour eux - sinon le UI ne saura pas où placer les sous-composants. BFreeman a suggéré BorderLayout qui est l'un des plus faciles à utiliser et vous permet de «coller» des choses en haut, en bas, à gauche, à droite ou au centre du parent.

Il y en a d'autres comme FlowLayout qui ressemble à un textarea - il ajoute des composants de gauche à droite en haut du parent et s'enroule sur une nouvelle ligne quand il arrive à la fin.

Le GridBagLayout qui a toujours été connu pour être impossible à comprendre, mais qui vous donne presque tout le contrôle dont vous auriez besoin. Un peu à l'image de ces tables HTML que nous avions l'habitude de voir avec des combinaisons bizarres d'attributs rowspan, colspan, width et height - qui ne semblaient jamais avoir la même apparence que vous en vouliez. MainPanel.add (new BlurbEditor())

1

;

mainPanel.validate();

mainPanel.repeindre();

+0

Je pense qu'il a dit qu'il a essayé ça. – durron597

0

Je traitais problème similaire, je voulais changer le panneau contenu dans un panneau sur l'exécution
Après quelques tests, retester et beaucoup d'échouer mon pseudo-algorithme est ceci:

parentPanel: contient les panneau nous voulons enlever
childPanel: panneau nous voulons changer
parentPanelLayout: la mise en page des parentPanel
editParentLayout(): construit parentPanel avec différents childPanel et NEW parentPanelLayout chaque fois

parentPanel.remove(childPanel); 
editParentLayout(); 
parentPanel.revalidate(); 
parentPanel.repaint(); 
Questions connexes