Frame nach Textfeldern durchsuchen

T1GGeR1990

Grünschnabel
Hi,

ich möchte ein Frame nach JTextFields durchsuchen und die Namen des Textfields in einer ArrayList schreiben.
Ich dachte man könnte es so machen:
Code:
for (Component c : frame.getComponents()) 
{
	try 
	{
		AuflistungFeldernamen.add(((JTextField)c).getText());
	}
	catch(Exception e)
	{}
}
Doch ist das einzige Element, dass ich auf diese Weise bekommen:
Code:
JRootPane

Da kann mir bestimmt jemand helfen =)

Danke

T1GGeR
 
Moin,

eventuell könnte dies hier Dein Problem lösen :
Java:
/*
	**  Append the text from the individual components
	**  to form the text for the group component.
	*/
	private String getComponentText(boolean delimiterRequired)
	{
		text.setLength( 0 );
		Component[] components = getComponents();

		for (int i = 0; i < components.length; i++)
		{
			if (components[i] instanceof JTextField)  // ******
			{
				JTextField textField = (JTextField)components[i];
				text.append( textField.getText() );
			}

			if (delimiterRequired && components[i] instanceof JLabel)
			{
				JLabel label = (JLabel)components[i];
				text.append( label.getText() );
			}
		}

		return text.toString();
	}

So wird es zumindest in meinem Projekt gemacht !
Gruß
Klaus
 
Hallo,

schau mal hier:

Java:
package de.tutorials;

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Container;
import java.util.ArrayList;
import javax.swing.*;

public class FindTextFieldNames extends JFrame {

	public FindTextFieldNames() {
		JTextField field1 = new JTextField();
		field1.setName("field1");
		add(field1, BorderLayout.NORTH);
		JPanel panel = new JPanel();
		JTextField field2 = new JTextField(10);
		field2.setName("field2");
		panel.add(field2);
		add(panel, BorderLayout.SOUTH);
		setSize(300, 300);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setVisible(true);
		ArrayList<String> textFieldNames = new ArrayList<String>();
		appendTextFieldNamesToList(textFieldNames, this);
		for (String textFieldName : textFieldNames) {
			System.out.println(textFieldName);
		}
	}

	private void appendTextFieldNamesToList(ArrayList<String> textFieldNames, Container c) {
		for (Component component : c.getComponents()) {
			if (component instanceof JTextField) {
				textFieldNames.add(((JTextField) component).getName());
			} else if (component instanceof Container) {
				appendTextFieldNamesToList(textFieldNames, (Container) component);
			}
		}
	}

	public static void main(String[] args) {
		new FindTextFieldNames();
	}
}

Gruß
Ben
 
Hier wird doch in deiner Methode als Container dann auch nur das JFrame übergeben oder?
Weil mir Java eben nur die JRootPane in die Liste schreibt und keine meiner JTextfields.
Java:
	private void appendTextFieldNamesToList(ArrayList<String> textFieldNames, Container c) {
		for (Component component : c.getComponents()) {
			if (component instanceof JTextField) {
				textFieldNames.add(((JTextField) component).getName());
			} else if (component instanceof Container) {
				appendTextFieldNamesToList(textFieldNames, (Container) component);
			}
		}
	}

Gruß
Ben
 
Hallo,

Hier wird doch in deiner Methode als Container dann auch nur das JFrame übergeben oder?
Weil mir Java eben nur die JRootPane in die Liste schreibt und keine meiner JTextfields.

Ja genau. Es wird der JFrame übergeben, der anschließend nach JTextFields durchsucht wird. Enthält der JFrame weitere Container, so werden diese rekursiv ebenfalls durchsucht. (Falls du etwa wie in meinem Beispiel die JTextFields in ein JPanel oder einen anderen Container gepackt hast)

Könntest du eventuell mal den Quelltext zeigen, wie du die JTextFields hinzufügst, bzw. wie du die Suchmethode aufrufst? Ich glaube, das würde weiterhelfen.
 
Hier mal der Quelltext:

Code:
public class InterneVeranstaltung 
{
   ...
   private JTextField txtName;
   private JFrame frame;
   
   public InterneVeranstaltung()
   {
       ...
       txtName = new JTextField("Name der Veranstaltung");
       frame = new JFrame("Titel");
       run();
   }
   
   public void run()
   {
       for (Component c : frame.getComponents())
       {
          try
          {
             JTextfield txt = (JTextfield)c;
             JOptionPane jop = new JOptionPane();
             jop.showMessageDialog(null, txt.getText());
          }
          catch(Exception e)
          {}
   }
   ...
}
 
Hallo,

du hast zwar ein JTextField erzeugt, aber es ist aus deinem Quelltext nicht ersichtlich, wo du das Feld deinem JFrame hinzufügst. Also sprich es fehlt mir so ne Zeile wie

Java:
frame.add(txtName)

Weil so isses natürlich klar, dass dein Textfeld nicht auftaucht, wenn du dir über frame.getComponents() die Komponenten auflisten lässt.

Gruß Ben
 
Java:
JFrame frame = new JFrame();
Container cp = frame.getContentPane();

ArrayList<String> textFieldNames = new ArrayList<String>();

JTextField txt1 = new JTextField();
txt1.setName("erste");
cp.add(txt1);

JTextField txt2 = new JTextField();
txt2.setName("zweite");
cp.add(txt2);
       
for (Component comp : cp.getComponents()){
        if (comp instanceof JTextField) 
             textFieldNames.add(comp.getName());
}

Gruß Attila
 
Und was ist da jetzt der Unterschied zu meinem oberen Beispiel, außer dass du den Umweg über die ContentPane gehst, was seit Java 1.5 aber nicht mehr nötig ist... Siehe:

As a conveniance add and its variants, remove and setLayout have been overridden to forward to the contentPane as necessary. This means you can write:

frame.add(child);

Außerdem erreichst mit deiner Methode keine Textfelder, die in weiteren Containern verschachtelt sind.
 
Zurück