2010-11-26 8 views
4

Je travaille actuellement sur une application qui ajoute JTextFields à un panneau à l'exécution en utilisant:Java - Ajouter un composant Swing à Runtime AVEC un nom de référence?

int rowCounter = 1;    
pnlRows.add(new JLabel("Row " + rowCounter)); 
pnlRows.add(new JTextField(20)); 
pnlRows.revalidate(); 
validate(); 

Le problème est que j'ai je veux utiliser leurs valeurs dans une méthode, mais n'a aucun moyen de les référencer.

Est-il possible de faire quelque chose le long des lignes de:

int i = 1; 
JTextField row + i = new JTextField(); 
i++; 

Alors que chaque fois que je lance le TextField en sera appelé ligne1, ligne2, row3 respectivement.

Merci.

Répondre

1

Non il n'y a pas, ce que vous devez faire est de les ajouter à une liste afin que vous puissiez les obtenir plus tard.

Quelque part dans votre classe, vous devez ceci:

List<JTextField> fields = new ArrayList<JTextField>(); 

Puis, quand ils les ajouter, vous pouvez le faire:

int rowCounter = fields.size()+1;    
pnlRows.add(new JLabel("Row " + rowCounter)); 
JTextField field = new JTextField(20); 
pnlRows.add(field); 
fields.add(field); 
pnlRows.revalidate(); 
validate(); 

Puis enfin WNE vous voulez les obtenir tout ce que vous pouvez parcourir la liste et obtenez tous les champs de texte un par un.

for(JTextField field : fields){ 
    dostuff ... 
} 
+0

Merci, cela a résolu mon problème – slex

2
public List<JTextField> rows = new Linkedlist<JTextField>(); 

addRow() { 
    JTextField field = new JTextField(20); 
    rows.add(field); 
    pnlRows.add(new JLabel("Row " + rows.size())); 
    pnlRows.add(field); 
    pnlRows.revalidate(); 
    validate(); 
} 
+0

Ceci est bien, même si vous n'avez pas besoin d'appeler revalidate() + validate(). revalidate() seul est suffisant. –

+1

pourquoi une liste * liée *? Ce n'est presque jamais le meilleur choix. –

1

Pour autant que je sache, ce n'est pas possible. Une autre (et peut-être plus propre) façon de le faire est de stocker les étiquettes lorsque vous les créez quelque chose comme

JTextField label = new JTextField(20); 
fieldList.add(label); 
pnlRows.add(label); 

Vous pouvez ensuite utiliser le fieldList pour accéder aux champs de texte que vous souhaitez:

JTextField label = fieldList.get(row); 

Modifier : fieldList est un

List<JTextField> 

bien sûr.