views:

2894

answers:

2

I have a JPanel full of JTextFields...

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

How do I later get the JTextFields in that JPanel? Like if I want their values with

TextField.getText();

Thanks

+5  A: 

Every JPanel in Java is also an AWT container. Thus, you should be able to use getComponents to get the array of contained components in the panel, iterate over them, check their types (To make sure you didn't get other controls), and do whatever you need with them.

However, this is generally poor design. If you know that you will need to access specific components, it is better to maintain an array of those text fields and pass it around, even though they are visually contained within the container.

If this is a recurrent task or could be done from multiple points, it may even make sense to have a special class representing a panel with text fields, that will then provide through its interface means of accessing these fields.

Uri
+3  A: 

Well bear in mind they didn't get there by them selves ( I think a read some questions about dynamically creating these panels at runtime )

In the answers posted there, someone said you should kept reference to those textfields in an array. That's exactly what you need here:

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.
}

// Later

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

Wasn't that easy?

Just remember to keep these kinds of artifacts ( list ) as private as possible. They are for your control only, I don't think they belong to the interface.

Let's say you want to get the array of texts, instead of

 public List<JTextField> getFields();

You should consider:

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