2008-12-16 10 views
14

Mam JPanel pełen JTextFields ...Java dostać składniki JPanel

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

Jak później uzyskać JTextFields w tym JPanel? Jakbym chciał ich wartości z

TextField.getText(); 

Dzięki

+0

Muszę powiedzieć, dzięki "nobody" do usuwania tych logo Apple i "thanksss" znak off. –

Odpowiedz

11

Dobrze pamiętać, że nie dostać się tam przez nich samych (myślę, że przeczytałem kilka pytań na temat tworzenia tych paneli dynamicznie w czasie wykonania)

w odpowiedziach zamieszczonych tam, ktoś powiedział, należy przechowywać odniesienie do tych pola tekstowe w tablicy. To jest dokładnie to, co trzeba tutaj:

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

// Później

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

nie było takie proste?

Pamiętaj tylko, aby zachować te rodzaje artefaktów (listy) tak prywatne, jak to możliwe. Są tylko dla twojej kontroli, nie sądzę, że należą do interfejsu.

Powiedzmy, że chcemy uzyskać tablicę tekstów, zamiast

public List<JTextField> getFields(); 

Należy rozważyć:

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

Każdy JPanel w Javie jest również pojemnik AWT. Zatem, powinieneś być w stanie użyć getComponents, aby uzyskać tablicę zawartych komponentów w panelu, iterować nad nimi, sprawdzać ich typy (aby upewnić się, że nie masz innych kontrolek) i robić, co potrzebujesz z nimi.

Jest to jednak ogólnie kiepski projekt. Jeśli wiesz, że będziesz potrzebować dostępu do określonych komponentów, lepiej będzie zachować tablicę tych pól tekstowych i przekazać ją, nawet jeśli są one wizualnie zawarte w kontenerze.

Jeśli jest to zadanie cykliczne lub może być wykonane z wielu punktów, może nawet mieć sens specjalna klasa reprezentująca panel z polami tekstowymi, które następnie będą zapewniać poprzez interfejs dostęp do tych pól.

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

Czy można uzyskać ten komponent o zadeklarowanej nazwie? Mam na myśli zmienną nazwę komponentu – Barrier

2

Należy wywołać metodę getComponents ten powraca z tablicą wszystkie elementy na twoim JPanelu. Po tym można wykonać iterację w tablicy i sprawdzić, czy jest ona równa poszukiwanemu komponentowi.

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

, czy można uzyskać ten komponent z zadeklarowaną nazwą? Mam na myśli nazwę zmiennej składnika. – Barrier

0

Twój problem polega na pisaniu żmudnego kodu. Dlaczego po prostu nie generują go i wklej w programie !! ...

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

Wklej wyjście powyższego kodu w programie i gotowe. Teraz, aby uzyskać dostęp do zawartości pól tekstowych można wygenerować żmudny tekst kodu w podobny sposób ....

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

To, co zrobiłem do rekursywnie przejść przez pojemnik i uzyskać pól tekstowych, które są na 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(""); 
     } 
    }   
} 

A potem go używać, to nazwać w ten sposób

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