Domanda

Ho un JPanel pieno di JTextFields ...

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

Come faccio seguito vengono i JTextFields in quella JPanel? Come se voglio i loro valori con

TextField.getText();

Grazie

È stato utile?

Soluzione

Bene tenere a mente che non ha ottenuto lì da loro stessi (mi pare una lettura ad alcune domande circa la creazione dinamica di questi pannelli in fase di esecuzione)

Nelle risposte postato lì, qualcuno ha detto che si dovrebbe mantenuto riferimento a quei campi di testo in un array. Questo è esattamente quello che vi serve qui:

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

// Successivo

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

Non era così facile?

Basta ricordarsi di tenere questo tipo di manufatti (elenco) come privato come possibile. Essi sono per il controllo solo, non credo a cui appartengono l'interfaccia.

Diciamo che si desidera ottenere la serie di testi, invece di

 public List<JTextField> getFields();

Si dovrebbe prendere in considerazione:

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

Altri suggerimenti

Ogni JPanel in Java è anche un contenitore AWT. Pertanto, si dovrebbe essere in grado di utilizzare getComponents per ottenere la matrice di componenti contenuti nel pannello, scorrere su di loro, controllare i loro tipi (Per essere sicuri di non ha ottenuto altri controlli), e fare tutto ciò che è necessario con loro.

Tuttavia, questo è generalmente cattiva progettazione. Se si sa che è necessario per accedere ai componenti specifici, è meglio mantenere un allineamento di quei campi di testo e passarlo in giro, anche se sono contenuti visivamente all'interno del contenitore.

Se questo è un compito ricorrente o potrebbe essere fatto da più punti, può anche avere senso per avere una classe speciale che rappresenta un pannello con i campi di testo, che sarà quindi fornire attraverso i suoi mezzi di interfaccia di accesso a tali campi.

Si dovrebbe chiamare il metodo getComponents questo ritorna con un array di tutti gli elementi sul vostro JPanel. Dopo si può iterare sulla matrice e verificare se è uguale con il ricercato componente.

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

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

Questo è quello che ho fatto passare in modo ricorsivo attraverso il contenitore e ottenere i campi di testo che sono sulle 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("");
      }
    }        
}

E poi di usarlo, si chiama in questo modo

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

dinamicamente dargli un nome durante la creazione e poi fare questo.

    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")
            }
        }

    }

Il tuo problema è la scrittura del testo noiosi codici. Perché non solo creare e incollarlo nel programma !! ...

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

Incolla l'uscita del codice di cui sopra nel vostro programma e si è fatto. Ora, per accedere al contenuto di campi di testo è possibile generare il testo noiosi codici in modo simile ....

for(int i=1 ; i<=maxpoints ;i++){
   System.out.println("String s"+i+" = JTextField tf"+i+".getText()"+";");
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top