Question

J'ai un JPanel plein de JTextFields ...

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

Était-ce utile?

La solution

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

Dans les réponses y affichées, quelqu'un a dit que vous devriez garder référence à ces 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?

Rappelez-vous simplement de garder ce genre d'objets (liste) aussi privée que possible. Ils sont pour votre contrôle que, 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 ... 

Autres conseils

Tous les JPanel en Java est également un conteneur AWT. Ainsi, vous devriez être en mesure d'utiliser getComponents pour obtenir l'ensemble des composants contenus dans le panneau, itérer sur eux, vérifier leurs types (Pour vous assurer que vous n'avez pas d'autres contrôles), et faire tout ce dont vous avez besoin avec eux.

Cependant, ce qui est généralement une mauvaise conception. Si vous savez que vous aurez besoin d'accéder à des composants spécifiques, il est préférable de maintenir un tableau de ces champs de texte et de le transmettre autour, même si elles sont visuellement contenus dans le conteneur.

Si cela est une tâche récurrente ou pourrait être fait à partir de multiples points, il peut même logique d'avoir une classe spéciale représentant un panneau avec des champs de texte, et qui fournira par ses moyens d'interface d'accès à ces champs.

Vous devez appeler la méthode getComponents cela retourne avec un tableau de tous les éléments sur votre JPanel. Une fois que vous pouvez itérer sur le tableau et vérifier si son égal à égal avec l'élément 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);
    }
}

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());
    //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);
        }
    }

donner Dynamiquement un nom lors de la création puis le faire.

    Component[] components = panel.getComponents();
    for (Component component: components) {
        var name = component.getName();  
        if(name != null){    
            if(name.equals("textfield 1")){
                var field = (JTextField)component;
                field.setText("whatever you want / same for options and other components")
            }
        }

    }

Votre problème est en train d'écrire le 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()"+";");
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top