2008-12-16 9 views
14

J'ai un JPanel plein de JTextFields ...Java obtenir des composants JPanel

for (int i=0; i<maxPoints; i++) { 
    JTextField textField = new JTextField(); 
    points.add(textField); 
} 

Comment puis-je obtenir plus tard, les JTextFields dans ce JPanel? Comme si je veux leurs valeurs avec

TextField.getText(); 

Merci

+0

Je dois dire merci « personne » pour enlever les logos de pomme et le signe « thanksss » off. –

Répondre

11

bien garder à l'esprit qu'ils ne sont pas là par eux-mêmes se (je pense que lire quelques questions sur la création dynamique de ces panneaux lors de l'exécution)

Dans les réponses postées là, quelqu'un a dit que vous devriez garder référence à ceux champs de texte dans un tableau. C'est exactement ce dont vous avez besoin ici:

List<JTextField> list = new ArrayLists<JTextField>(); 

// your code... 
for (int i=0; i<maxPoints; i++) { 
    JTextField textField = new JTextField(); 
    points.add(textField); 
    list.add(textField); // keep a reference to those fields. 
} 

// Plus tard

for(JTextField f : list) { 
    System.out.println(f.getText()) ; 
} 

était-ce pas facile? N'oubliez pas de garder ces types d'artefacts (liste) aussi privé que possible. Ils sont pour votre contrôle seulement, je ne pense pas qu'ils appartiennent à l'interface.

Disons que vous voulez obtenir le tableau de textes, au lieu de

public List<JTextField> getFields(); 

Vous devriez considérer:

public List<String> getTexts(); // get them from the textfields ... 
10

Chaque JPanel en Java est également un conteneur AWT. Ainsi, vous devriez être capable d'utiliser getComponents pour obtenir le tableau des composants contenus dans le panneau, les parcourir, vérifier leurs types (pour vous assurer que vous n'avez pas obtenu d'autres contrôles), et faire tout ce dont vous avez besoin avec eux.

Cependant, cette conception est généralement médiocre. Si vous savez que vous devrez accéder à des composants spécifiques, il est préférable de conserver un tableau de ces champs de texte et de le transmettre, même s'ils sont visuellement contenus dans le conteneur. Si cela est une tâche récurrente ou pourrait être faite à partir de plusieurs points, il peut même être logique d'avoir une classe spéciale représentant un panneau avec des champs de texte, qui fournira ensuite à travers son interface des moyens d'accéder à ces champs.

1
//una forma de recorer todos los elementos dentro de un jpanel 
    Component[] components = jPanelX.getComponents(); 

    for (int i = 0; i < components.length; i++) { 

     if(components[i].getClass().getName().toString().equals("javax.swing.JTextField")){ 
      components[i].setEnabled(false); 
     } 
    } 
+1

Est-il possible d'obtenir ce composant avec son nom déclaré? Je veux dire le nom de la variable du composant – Barrier

2

Vous devez appeler la méthode getComponents cela retourne avec un tableau de tous les éléments sur votre JPanel. Après vous pouvez itérer sur le tableau et vérifier s'il est égal au composant recherché.

List<JTextField> list = new ArrayLists<JTextField>(); 
Component[] components = panel.getComponents(); 

for (Component component : components) { 
    if (component.getClass().equals(JTextField.class)) { 
     list.add((JTextField)component); 
    } 
} 
+0

est-il possible d'obtenir ce composant avec son nom déclaré? Je veux dire le nom de la variable du composant. – Barrier

0

Votre problème est l'écriture du texte de code fastidieux. Pourquoi ne pas simplement générer et coller dans le programme !! ...

for(int i=1 ; i<=maxpoints ;i++){ 
    System.out.println("JTextField tf"+i+" = new JTextField()"+";"); 
    System.out.println("points.add(tf"+i+")"+";"); 
} 

Coller la sortie du code ci-dessus dans votre programme et vous avez terminé. Maintenant, pour accéder au contenu des champs de texte que vous pouvez générer le texte de code fastidieux d'une manière similaire ....

for(int i=1 ; i<=maxpoints ;i++){ 
    System.out.println("String s"+i+" = JTextField tf"+i+".getText()"+";"); 
} 
1

C'est ce que je faisais pour aller récursive à travers le récipient et obtenir les textfields qui sont sur les JPanels.

private void ClearAllFields(Container myContainer) { 

    Component myComps[] = myContainer.getComponents(); 

    for (int i=0; i<myComps.length; i++) { 
     if(myComps[i] instanceof JPanel) { 
      JPanel myPanel = (JPanel) myComps[i]; 
      ClearAllFields(myPanel); 
     } 
     if(myComps[i] instanceof JTextField) { 
     JTextField myTextField = (JTextField) myComps[i]; 
     myTextField.setText(""); 
     } 
    }   
} 

Et puis l'utiliser, vous l'appelez ainsi

ClearAllFields([jdialog or jframe etc].getContentPane());