Frage

Ich habe ein JPanel voller JTextFields ...

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

Wie komme ich später die JTextFields in diesem JPanel? Wie, wenn ich will, dass ihre Werte mit

TextField.getText();

Danke

War es hilfreich?

Lösung

Nun bedenken Sie haben sie nicht dorthin gelangen, indem sie selbst (ich glaube, ein paar Fragen lesen über dynamisch diese Panels zur Laufzeit erstellen)

In den Antworten dort geschrieben, sagte jemand, den Sie Bezug in einem Array zu diesen Textfeldern gehalten sollten. Das ist genau das, was Sie brauchen hier:

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

// Später

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

War das nicht einfach?

Denken Sie daran, diese Art von Artefakten (Liste) so privat wie möglich zu halten. Sie sind für Ihre Steuerung nur, ich glaube nicht, dass sie an die Schnittstelle gehören.

Angenommen, Sie haben das Array von Texten erhalten möchten, statt

 public List<JTextField> getFields();

Sie sollten beachten:

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

Andere Tipps

Alle JPanel in Java ist auch ein AWT-Container. Daher sollten Sie in der Lage sein getComponents zu verwenden, um die Anordnung von Komponenten, die in der Platte zu bekommen, über sie iterieren, ihre Typen überprüfen (um sicherzustellen, dass Sie nicht andere Steuerelemente bekommen haben), und zu tun, was man mit ihnen benötigen.

Dies ist jedoch im Allgemeinen ein schlechtes Design. Wenn Sie wissen, dass bestimmte Komponenten zugreifen müssen, ist es besser, eine Reihe dieser Textfelder zu halten und um passieren, auch wenn sie visuell in dem Behälter enthalten sind.

Wenn diese regelmäßig wieder Aufgabe ist oder könnten aus mehreren Punkten erfolgen, es kann sogar sinnvoll sein, eine spezielle Klasse hat einen Panel mit Textfeldern darstellt, die dann durch die Schnittstellenmittel für den Zugriff auf diese Felder zur Verfügung stellen wird.

sollten Sie die getComponents Methode nennen dies mit einem Array aller Elemente auf Ihrer JPanel zurückgibt. Nachdem Sie auf dem Array laufen können und prüfen, ob sein mit dem gefragten Komponente entspricht.

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

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

Das ist, was ich tat rekursiv durch den Behälter zu gehen und die Textfelder erhalten, die auf dem JPanels ist.

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

Und dann, es zu benutzen, Sie es nennen diese Art und Weise

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

Dynamisch geben Sie einen Namen bei der Erstellung und dann das tun.

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

    }

Ihr Problem schreibt den mühsamen Codetext. Warum nicht einfach erzeugen und in das Programm einfügen !! ...

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

Fügen Sie den Ausgang des obigen Code in Ihrem Programm und Sie sind fertig. Nun, für den Zugriff auf den Inhalt von Textfeldern können Sie den langweiligen Codetext in einer ähnlichen Art und Weise erzeugen ....

for(int i=1 ; i<=maxpoints ;i++){
   System.out.println("String s"+i+" = JTextField tf"+i+".getText()"+";");
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top