# Textfield auslesen auf Anforderung



## roland_2345 (27. Mrz 2011)

Hallo Forum, 

irgendwie steh ich seit gestern auf dem Schlauch.
Ich habe eine Klasse, die stellt mir ein Fenster dar mit einem Textfield, in dem der Benutzer eine Eingabe machen soll. 
Die Eingabe wird abgeprüft, wenn sie fehlerhaft ist, dann gibt es einen Hinweis und die Eingabe muss wiederholt werden. 
Funktioniert soweit. 
Mein Problem ist nun: Ich will aus einer anderen Klasse eine Methode aufrufen, die mir genau eine korrekte Eingabe zurückliefert. Wie schreibe ich die am besten ?
Die Methode soll so aussehen: 	
public String Get_gueltigen_wert() 
Erst in der Methode soll die Kontrolle an die Klasse gegeben werden und erst dann sollten Eingaben gemacht werden 
Hat jemand eine Idee, die mir hier weiterhilft ?

Vielen Dank

Roland


```
import java.awt.*;                // das Paket awt wird sichtbar gemacht
import java.awt.event.*;          // Ereignisbehandlung

public class eingabetest 
	extends Frame 	{

       private TextField eingabe;
	private Label     ausgabe;

	public eingabetest() {	           		//Konstruktor
		super("Bitte geben Sie die Zahlen ein ");              //Den Titel festlegen
		Panel myContainer = new Panel();		//spezieller Container
		myContainer.setLayout(new BorderLayout(20,20));		//Layout einsetzen
		myContainer.setBackground(Color.lightGray);

	    eingabe = new TextField();
	    ausgabe = new Label();
		
	    setFont(new Font("sanserif", Font.BOLD, 20));
		
        myContainer.add(ausgabe,BorderLayout.CENTER);
        myContainer.add(eingabe,BorderLayout.SOUTH );
        
        eingabe.addActionListener(
        	      new ActionListener() {
        	        public void actionPerformed( ActionEvent ev ) {
        	          uebernehme_eingabe(); } } );

        addWindowListener(
        	      new WindowAdapter() {
        	        public void windowClosing( WindowEvent ev ) {
        	          dispose();
        	          System.exit( 0 ); } } );

		this.add(myContainer);				//Container dem Fenster hinzufuegen

		setLocation (600, 10);
		setSize(400, 200);
        setVisible(true);
	}
	
	void uebernehme_eingabe()
	{   
		// hier prüfe ich die Eingabe, wenn sie nicht stimmt, lasse ich wieder 
		// eingeben, wenn sie stimmt, nehme ich sie in ein internes Feld auf
		// fuer das Beispiel hier zeige ich sie einfach an
            	ausgabe.setText( "Eingabe war: " + eingabe.getText() );
            	eingabe.setText("");
 	}

	public static void main(String[] arg) {		//Das Hauptprogramm
		eingabetest myWin = new eingabetest();
  	}
}
```


----------



## SlaterB (28. Mrz 2011)

bisher hast du doch noch gar keine separate Klasse und entsprechende Methode, oder?
wo genau liegt das Problem, ist nicht vollkommen klar was in dieser Methode stehen muss?

> und erst dann sollten Eingaben gemacht werden 
klingt verdächtig falsch, die GUI läuft für sich falls sie mal nicht gerade blockiert ist, dort kann ständig etwas eingetippt werden, 
das Restprogramm macht im einfachen Fall die meiste Zeit gar nichts, wird nur auf Button-Klick oder ähnliches kurzzeitig aktiv,
arbeitet dann für wenige ms, solange macht der User im Regelfall nichts (vergleiche Eintippen in Browser-Forum + Absenden-Klick)


----------



## roland_2345 (28. Mrz 2011)

Hallo, 
danke für den Input. Du hast recht, das Coding für die Klasse ist noch nicht fertig. 
Zum einfachen Erklärung:
Ich will ein Programm schreiben, in dem ich z.B. Lottozahlen eingeben und auswerten möchte. 
Da habe ich eine hauptklasse, die macht
- Instanz von "eingabetest" erzeugen
...
-  abfrage der ersten Eingabe durch eingabetest.hole_einen_gueltigen_wert()
- verarbeitung 
- abfrage der zweiten Eingabe durch eingabetest.hole_einen_gueltigen_wert()

Ich habe die methode mal ergänzt, wie sie ungefähr funktionieren könnte. 
Aber mir ist nicht wohl dabei, da es eine endlosschleife darstellt und die Gefahr besteht, dass es irgendwas geben könnte, was dann nicht zur beendigung der Schleife führt. Und ich frage mich, ob es nicht einen besseren Weg dafür gibt. 

Viele Grüsse
Roland 


```
import java.awt.*;                // das Paket awt wird sichtbar gemacht
import java.awt.event.*;          // Ereignisbehandlung

public class eingabetest 
	extends Frame 				  //Unsere Klasse erweitert die Klasse Frame
	{

    private TextField eingabe;
	private Label     ausgabe;
	boolean   gueltige_eingabe = true;

	public eingabetest() {	           		//Konstruktor
		super("Bitte geben Sie die Zahlen ein ");              //Den Titel festlegen
		Panel myContainer = new Panel();		//spezieller Container
		myContainer.setLayout(new BorderLayout(20,20));		//Layout einsetzen
		myContainer.setBackground(Color.lightGray);

	    eingabe = new TextField();
	    ausgabe = new Label();
		
	    setFont(new Font("sanserif", Font.BOLD, 20));
		
        myContainer.add(ausgabe,BorderLayout.CENTER);
        myContainer.add(eingabe,BorderLayout.SOUTH );
        
        eingabe.addActionListener(
        	      new ActionListener() {
        	        public void actionPerformed( ActionEvent ev ) {
        	          uebernehme_eingabe(); } } );

        addWindowListener(
        	      new WindowAdapter() {
        	        public void windowClosing( WindowEvent ev ) {
        	          dispose();
        	          System.exit( 0 ); } } );

		this.add(myContainer);				//Container dem Fenster hinzufuegen

		setLocation (600, 10);
		setSize(400, 200);
        setVisible(true);
	}
	
	void uebernehme_eingabe()
	{   
		// hier prüfe ich die Eingabe, wenn sie nicht stimmt, lasse ich wieder 
		// eingeben, wenn sie stimmt, nehme ich sie in ein internes Feld auf
		// fuer das Beispiel hier zeige ich sie einfach an
            	ausgabe.setText( "Eingabe war: " + eingabe.getText() );
            	eingabe.setText("");
            	gueltige_eingabe = true;
   	}

	
	public String hole_einen_gueltigen_wert() {
		gueltige_eingabe = false;
		while (gueltige_eingabe == false){
			// warte, Endlosschleife
		}
		return ausgabe.getText();
	}

	public static void main(String[] arg) {		//Das Hauptprogramm
		eingabetest myWin = new eingabetest();
		
		System.out.println("erster Wert: " + myWin.hole_einen_gueltigen_wert());
		System.out.println("zweiter Wert: " + myWin.hole_einen_gueltigen_wert());

	}
}
```


----------



## SlaterB (28. Mrz 2011)

falls du das Wort wieder mir erteilst:
ich wüßte nicht was ich neues schreiben sollte außer energisch darauf hinzuweisen, dass normalerweise keine Schleife nebenher läuft, 
siehe meine erste Antwort bzw. beliebige Anfänger-GUI-Beispiel-Programme in denen irgendetwas passiert


----------



## roland_2345 (30. Mrz 2011)

Hi all, 
ich glaube, ich habe nun eine Lösung mit der ich für den Test zufrieden bin.
Erst In der Methode, die das Textfeld abfragt, starte ich erst den Action listener. 
Dann warte ich, bis eine Eingabe gemacht wurde, remove den Action listener wieder und setze das Textfeld auf 
nicht editierbar. 

den kompletten code:

```
import java.awt.*;                // das Paket awt wird sichtbar gemacht
import java.awt.event.*;          // Ereignisbehandlung
import javax.swing.*;


public class eingabetest 
	extends Frame 				  //Unsere Klasse erweitert die Klasse Frame
	{

    private JTextField eingabe;
	private JLabel     ausgabe;
	boolean   gueltige_eingabe = true;

	public eingabetest() {	           		//Konstruktor
		super("Bitte geben Sie die Zahlen ein ");              //Den Titel festlegen
		Panel myContainer = new Panel();		//spezieller Container
		myContainer.setLayout(new BorderLayout(20,20));		//Layout einsetzen
		myContainer.setBackground(Color.lightGray);

	    eingabe = new JTextField();
	    ausgabe = new JLabel();
		
	    setFont(new Font("sanserif", Font.BOLD, 20));
		
        myContainer.add(ausgabe,BorderLayout.CENTER);
        myContainer.add(eingabe,BorderLayout.SOUTH );
        
        addWindowListener(
        	      new WindowAdapter() {
        	        public void windowClosing( WindowEvent ev ) {
        	          dispose();
        	          System.exit( 0 ); } } );

		this.add(myContainer);				//Container dem Fenster hinzufuegen

		setLocation (600, 10);
		setSize(400, 200);
        setVisible(true);
	}
	
	void uebernehme_eingabe()
	{   
		// hier prüfe ich die Eingabe, wenn sie nicht stimmt, lasse ich wieder 
		// eingeben, wenn sie stimmt, nehme ich sie in ein internes Feld auf
		// fuer das Beispiel hier zeige ich sie einfach an
            	ausgabe.setText( "Eingabe war: " + eingabe.getText() );
            	eingabe.setText("");
   	}

	
	public String hole_einen_gueltigen_wert() {
		gueltige_eingabe = false;
		eingabe.setEditable(true);
		eingabe.addActionListener(
      	      new ActionListener() {
      	        public void actionPerformed( ActionEvent ev ) {
      	           uebernehme_eingabe(); 
      	           gueltige_eingabe = true; } } );

      	while (gueltige_eingabe == false){
			// warte, Endlosschleife
		}
      	
        for(ActionListener al: eingabe.getActionListeners()){
            eingabe.removeActionListener(al);
          }
          eingabe.setEditable(false);
		return ausgabe.getText();
	}

	
	public static void main(String[] arg) {		//Das Hauptprogramm
		eingabetest myWin = new eingabetest();
		
		System.out.println("erster Wert: " + myWin.hole_einen_gueltigen_wert());
		System.out.println("zweiter Wert: " + myWin.hole_einen_gueltigen_wert());

	}
}
```


----------

