2015-04-20 1 views
0

J'ajoute dynamiquement subPanel à jPanel1 (avec jTextField et jButton). Une partie du code de pièce a été empruntée à there.obtenir le texte de jPanel ajouté dynamiquement

J'essaye d'obtenir le texte des composants de jPanel1, mais ne peux pas réussir.

ÉDITÉ: Ceci est un sous-panneau qui contient jTextField, +Button et -Button.

private class subPanel extends javax.swing.JPanel {   
     subPanel me; 
     public subPanel() { 
      super(); 
      me = this; 
      JTextField myLabel = new JTextField(15); 
      add(myLabel); 
      JButton myButtonRemove = new JButton("-"); 
      JButton myButtonAdd = new JButton("+"); 
      add(myButtonRemove); 
      add(myButtonAdd); 

est ici le code de AddButton:

jPanel1.add(new subPanel()); 
    pack(); 

Le code que je suis en train d'obtenir le texte de jTextField ne fonctionne pas:

 Component[] children = jPanel1.getComponents(); 
    for (int i=0;i<children.length;i++){ 
    if (children[i] instanceof JTextField){ 
    String text = ((JTextField)children[i]).getText(); 
    System.out.println(text); 

}

Votre réponse sera grandement apprécié.

+0

Vous créez les nouveaux JPanel à addActionPerformed, non? Avez-vous essayé de conserver le nouveau JPanel en tant que variable dans le contexte de votre classe Main et d'accéder directement à ses membres? –

+0

@Oliver Schmidt: Oui j'ai créé un nouveau JPanel dans addActionPerformed, et j'ai essayé votre suggestion quand je déclare JPanel comme variable que je ne pouvais pas ajouter dynamiquement jPanels. –

+0

Tout d'abord, la méthode 'void addPanel()' n'est jamais appelée dans votre exemple de code. Pourtant, cela devrait être la méthode qui ajoute des contrôles à 'jXTaskPane1', non? Deuxièmement, la classe interne 'private class addPanel' n'ajoute aucune autre valeur à la classe JPanel qu'elle étend. Au lieu de cela, il déroute le lecteur :-) Troisièmement, lorsque j'exécute le code, ** vide ** JPanels (ou 'addPanel's) sont ajoutés à' jXTaskPane1'. Sûrement vous ne pouvez pas accéder à des contrôles sur un JPanel vide, car il n'y a rien à y accéder! :-) Pourriez-vous s'il vous plaît réécrire l'exemple afin qu'il fasse ce que vous avez indiqué dans votre question? –

Répondre

0

problème est: Vous itérez les enfants de jPanel1:

jPanel1.getComponents(); 

Et attendez d'être JTextField:

if (children[i] instanceof JTextField){ 
    String text = ((JTextField)children[i]).getText(); 
    System.out.println(text); 
} 

Mais puisque vous avez ajouté subPanels-jPanel1, les enfants de jPanel1 sont subPanels, pas JTextFields! Donc, pour accéder au JTextFields, vous devrez parcourir les enfants du subPanels dans un deuxième for-loop!

Exemple:

Component[] children = jPanel1.getComponents(); 
// iterate over all subPanels... 
for (Component sp : children) { 
    if (sp instanceof subPanel) { 
     Component[] spChildren = ((subPanel)sp).getComponents(); 
     // now iterate over all JTextFields... 
     for (Component spChild : spChildren) { 
      if (spChild instanceof JTextField) { 
       String text = ((JTextField)spChild).getText(); 
       System.out.println(text); 
      } 
     } 
    } 
} 
+0

Merci beaucoup. Fonctionne bien !!!! Votre réponse est acceptée. –

+0

Votre méthode fonctionne bien, mais une question se pose. J'aimerais demander si je peux avoir un accès individuel à chaque 'JTextFields'? –

+0

Oui, dans la boucle la plus interne, vous avez déjà accès à chacun d'entre eux. –