# TextField auslesen & in Objekteigenschaften speichern



## rorton (29. Okt 2010)

Hallo Leute,

hab zwar die Suche schon etwas verwendet, aber bin noch nicht so ganz schlau geworden.
Vielleicht könnt ihr mir einen Denkanstoß geben...

Ich habe 2 Klassen: 

MainGui und Movie

MainGui, wie der Name schon sagt besitzt mehrere JTextFields und einen OK-Button. 
Im Prinzip möchte ich in diesen Feldern die Werte der Instanzvariablen der Klasse Movie eintragen und mit dem OK-Button ein neues Movie-Objekt mit diesen Werten der Textfelder speichern.

Wie starte ich da am Besten?

Mit Feldname.getText() die Werte in einem String-Array speichern und mit einer Methode in der Klasse Movie zuweisen? Ich hab aber nicht nur Strings, sondern auch Date und int dabei!

StringBuilder mit Trennzeichen wird in diesem Fall auch nicht viel Sinn machen oder?

Danke für die Hilfe...


----------



## Cru (29. Okt 2010)

Wenn ich richtig verstehe was du machen willst, gibts doch eigentlich nicht viel zu machen..?

Dein "OK"-Button besitzt einen ActionListener, der eben die Werte aus deinen TextFields ausliest, umwandelt in das gewünschte Format(z.B. Date) und daraus dann ein Objekt Movie bildet...

Edit: Zum Formatieren eines Datums, kann man den ausgelesenen String einfach splitten...war heute glaube ich schonmal in einem Thread Thema


----------



## Network (29. Okt 2010)

Also ich hab das jetzt so verstanden, dass deine Int-Werte beispieslweise mit im auszulesenen TextFeld stehen... Also in einem Text (?)

Da könntest du natürlich, mehrere ArrayLists verwenden, die in einer übergeordneten ArrayList sich befinden. Also 3 ArrayLists in einer. Jedes einem anderen Datentyp zugeordnet!
Und dann gleich am Anfang des einlesens die Werte aussortieren.

Soweit ich weiss, jedoch, werden die Werte mit getText() sofort als String verwertet. Es macht also keinen Unterschied ob du die Daten vorher aussortierst oder danach.

Desweiteren gibt es eig. nurnochmal auf die Befehle hinzuweisen:

```
Integer int = Integer.parseInt( string );
```
und 

```
Date date = SimpleDateFormat.parse( string );
```


----------



## rorton (29. Okt 2010)

ja, rein theoretisch weiß ich was du meinst, aber praktisch schaut es anders aus! 


```
public void actionPerformed(ActionEvent e) {
	  String action_com = e.getActionCommand();
          //mit dem button save die werte auslesen
          if (action_com.equals("save")) {
          fieldInput = field.getText();
          fieldInput2 = field2.getText();
		
          //neues Objekt erzeugen und die Werte zuweisen
          Movie m1 = new Movie();
          m1.setName(fieldInput);
          m1.setActor(fieldInput2);
        }
        else if (action_com.equals("print")) {
                //das funzt schon nicht! m1 ist aber global deklariert!
        	System.out.println(m1.toString());
        }
```

Mein ansatz ist sicher totaler Bullshit! Vorallem will ich ja dynamisch neue Movie-Objekte erzeugen, nicht so wie in dieser Methode wo alles hart codiert ist!

Diese erzeugten objekte möchte ich dann wenn möglich auch noch in einer arraylist speichern können!


----------



## Cru (29. Okt 2010)

Sowas vielleicht?


```
buttonOk.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				leseWerteAus();	
			}

			private void leseWerteAus() {
				String string1 = field1.getText();
				int int1 = Integer.valueOf(field2.getText());
				Movie mov = new Movie();
				mov.setString1(string1);
				mov.setInt1(int1);
				movieListe.add(mov);//vorher mal eine ArrayList<Movie> anlegen
			}
```

Edit: Könntest auch mal deine Movie-Klasse zeigen^^


----------



## rorton (29. Okt 2010)

So, hier meine sehr vereinfachten Klassen:

MainGui mit Main-Methode zum Testen:


```
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;


public class MainGui extends JFrame implements ActionListener {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	private JLabel labelName, labelActor;
	private JTextField fieldName, fieldActor;
	private JButton buttonSave, buttonShow;
	private List<Movie> movieList;
	
	
	public MainGui() {
		
		super();
		this.init();
	
	}
	
	public void init() {
		
		this.setSize(200,400);
		this.setLayout(new FlowLayout());
		this.setResizable(false);
		this.setVisible(false);
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
	
		this.add(this.getLabelName());
		this.add(this.getFieldName());
		this.add(this.getLabelActor());
		this.add(this.getFieldActor());
		this.add(this.getButtonSave());
		this.add(this.getButtonShow());

	}
	
	public JLabel getLabelName() {
		if (labelName == null) {
			labelName = new JLabel("Name");
		}
		return labelName;	
	}
	
	public JLabel getLabelActor() {
		if (labelActor == null) {
			labelActor = new JLabel("Actor");
		}
		return labelActor;	
	}
	
	public JTextField getFieldName() {
		if (fieldName == null) {
			fieldName = new JTextField(10);
		}
		return fieldName;	
	}
	
	public JTextField getFieldActor() {
		if (fieldActor == null) {
			fieldActor = new JTextField(10);
		}
		return fieldActor;
	}
	
	public JButton getButtonSave() {
		if (buttonSave == null) {
			buttonSave = new JButton("Save");
			buttonSave.addActionListener(this);
			buttonSave.setActionCommand("save");
		}
		return buttonSave;	
	}
	
	public JButton getButtonShow() {
		if (buttonShow == null) {
			buttonShow = new JButton("Show");
			buttonShow.addActionListener(this);
			buttonShow.setActionCommand("show");
		}
		return buttonShow;	
	}
	
	public List<Movie> getMovieList() {
		if (movieList == null) {
			movieList = new ArrayList<Movie>();
		}
		return movieList;
	}
	
	public void getValues() {
		
		String nameString = fieldName.getText();
		String actorString = fieldActor.getText();
		
		Movie movie = new Movie();
		movie.setName(nameString);
		movie.setActor(actorString);
		
		movieList.add(movie);
		
	}
	
	public void showMovieList()  {
		
		for (Movie movie : movieList) {
			System.out.println(movie.toString());
		}
	}
	
	public void actionPerformed(ActionEvent e) {
		String action_com = e.getActionCommand();
        if (action_com.equals("save")) {
        	this.getValues();
        } 
        else if (action_com.equals("show")) {
        	this.showMovieList();
        }
	}
	
	
	public static void main(String[] args) {
		
		MainGui m1 = new MainGui();
		t1.setVisible(true);
		
	}
	
}
```

und die Movie-Klasse:


```
public class Movie {
	
	private String name;
	private String actor;
	

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getActor() {
		return actor;
	}

	public void setActor(String actor) {
		this.actor = actor;
	}
	
	public String toString() {
		
		return this.name + " " + this.actor;
	}

}
```

funktioniert noch nicht ganz... 
wenn ich das ganze nach dem MVC-Pattern aufbauen würde, wo würde ich dann die ArrayList reinstecken bzw. würde ich die neuen Movie-Objekte auch in der actionPerformed erzeugen?


----------



## rorton (29. Okt 2010)

Sorry, habs gefunden!
Wenn ich schon eine Methode zur Erstellung der ArrayList verwende sollte ich diese wohl auch aufrufen! 

aber meine Frage zum MVC bleibt... 
MainGui und Movie würde unter View fallen, oder? Im MainController laufen dann die Interaktionen.. und soll ich eine eigene Klasse mit der movieList erstellen und die dann ins Model stecken?

danke leute, ich geh jetzt ins bett und werde mich morgen früh mit java aufwecken!


----------



## rorton (30. Okt 2010)

Guten Morgen an alle..

hab noch ein Problem mit der Formatierung meines Datums:

Obwohl ich im Konstruktor von SimpleDateFormat nur Tag, Monat und Jahr angebe, bekomme ich folgende Ausgabe: Fri Oct 29 00:00:00 CEST 2010


```
String Buffer = field.getText();

             try{
                 SimpleDateFormat format = new SimpleDateFormat("dd.MM.yyyy");
                 Date date = format.parse(Buffer);
              
                 //diese Methode erwartet den Typ Date
                 Objektname.setDate(date);
                 
             }catch(ParseException e){
                 e.printStackTrace();
             }
```


----------



## Cru (30. Okt 2010)

SimpleDateFormat formatiert das Datum als String...


----------



## rorton (30. Okt 2010)

ok, aber wie genau soll ich das jetzt verstehen..

Aus meinem JTextField bekomme ich ja schon einen String, z.B "12.01.2001"!
Wie konvertiere ich nun diesen String in Date, damit auch wirklich nur das Datum, ohne Uhrzeit, ausgegeben wird?


----------



## Cru (30. Okt 2010)

Ich verstehe ehrlich gesagt das Problem nicht...wieso gibst du nicht einfach den String aus?

Oder wofür brauchst du ein Datum? Möchtest du mit diesem Objekt weiterarbeiten?
Sonst würdest du ein Datum als Objekt doch gar nicht brauchen...


----------



## rorton (30. Okt 2010)

in meiner Klasse gibt es eine Eigenschaft - ReleaseDate vom Typ Date!

Aus meinem Textfeld bekomme ich ja einen String.. diesen String muss ich in Date umwandeln, um es dann an die Objekteigenschaft weitergeben zu können.

Die Objekte sammle ich dann wie oben beschrieben in einer ArrayList, welche ich dann wenn möglich in einen JTable einlesen möchte.. Daher möchte ich beim Datum nur dd.MM.yyyy haben, keine Uhrzeit im Table haben..


----------



## Cru (30. Okt 2010)

Dann änderst du dein ReleaseDate zum Typ String und fertig ist


----------



## rorton (30. Okt 2010)

ja schon, aber sollte eine Eigenschaft, die eigentlich ein Datum ist, als Typ ein String sein..
Spätestens wenn ich die 10 ältesten filme per Datum ausgeben möchte wirds sicher blöd oder?


----------



## Cru (30. Okt 2010)

Nein, wieso?

Du arbeitest doch trotzdem mit den Werten aus dem Textfeld.

Alternativ: Datum speichern, wenn du es ausgeben lassen willst, lässt du dir nur den String vom SimpleDateFormat ausgeben...wäre aber glaube ich nicht das Wahre 

Ein Objekt vom Typ Date hat immer das von dir beschrieben Format.


----------



## rorton (30. Okt 2010)

ok, werde deine vorschläge mal testen!  

Danke!


----------



## JohannisderKaeufer (30. Okt 2010)

```
String Buffer = field.getText();
 
             try{
                 SimpleDateFormat format = new SimpleDateFormat("dd.MM.yyyy");
                 Date date = format.parse(Buffer);
              
                 //diese Methode erwartet den Typ Date
                 Objektname.setDate(date);

                 //So macht man aus dem Date wieder einen String vom Typ dd.MM.yyyy
                 String string = format.format(date);
                 
             }catch(ParseException e){
                 e.printStackTrace();
             }
```


----------



## rorton (10. Nov 2010)

Danke, das hat super geholfen..

Hat jemand noch einen Tipp zu folgendem Problem:

Ich habe 5 JTextField und einen Button.. Der User muss in jedes Feld einen Text eingeben, sozusagen ein Pflichtfeld. Wenn der User nun auf den Button klickt,soll überprüft werden, ob im Textfeld auch etwas steht.. wenn ja können die Inhalte der Textfelder ausgelesen werden und in einem passenden Objekt gespeichert werden.. wenn nein einfach einen JDialog zeigen damit eine Eingabe gemacht werden muss..

Kann ich das mit if-abfragen lösen ? zum beispiel so:



```
public void validateField1() {
 String buffer = textField1.getText();
 if(buffer.equals("")) {
  JOptionPane.showMessageDialog.....bla,bla..
 }
 else {
 passendesObjekt.setText(buffer);
 }

}
```

nur was mach ich, wenn ich eben mehrere Felder habe, und die Objekte in einer seperaten Methode befüllen möchte und dann vielleicht noch in einer ArrayList speichern will?

Gibt es da einen einfacheren Weg? Ich glaube ich denke zu kompliziert! :rtfm:


----------



## Network (10. Nov 2010)

Dein ganz unten beschriebenes Problem ist mir jetzt nicht ganz klar. Versuche aber mal auf das bis jetzt verstandene einzugehen:

Wenn du wissen möchtest ob da was drin steht oder nicht, kannst du auch nach

```
buffer == null
```
fragen.

Wenn du mehrere Textfelder hast, sieht das nicht weiter anderst aus.
Du erweiterst einfach deine If-Abfrage mit "&&" oder "||"
&& = und
|| = oder

Wenn beide (in dem Bsp nur 2) Textfelder leer sind dann...

```
if(( textField1.getText() == null )&&( textField2.getText() == null ))
{
      ...
}
```

Wenn eines der beiden Textfelder leer ist dann...

```
if(( textField1.getText() == null )||( textField2.getText() == null ))
{
      ...
}
```


----------



## rorton (10. Nov 2010)

du triffst mein problem eigentlich sehr genau, danke!

das heißt auch mit 10 textfeldern würdest du eine if-abfrage mit dann doch mehreren && empfehlen?


----------



## Network (10. Nov 2010)

Da du "&&" erwähnst, nehme ich an du willst, dass nicht alle Felder ausgefüllt sein müssen. Aber mindestens eins.

Nun da könntest du als Alternative deinen String "buffer" mit allen Zeilen füllen.

```
buffer = textField1.getText() + textField2.getText() ...
```
und diesen dann einmal überprüfen. Wenn dieser dann null ergibt, heißt das, dass ALLE leer sein müssten.

Auf jedenfall kann man es so zusammenfassen.


----------



## Michael... (10. Nov 2010)

Network hat gesagt.:


> Nun da könntest du als Alternative deinen String "buffer" mit allen Zeilen füllen.
> 
> ```
> buffer = textField1.getText() + textField2.getText() ...
> ...


getText() wird niemals null (höchstens "null") liefern.


----------



## Network (11. Nov 2010)

Michael... hat gesagt.:


> getText() wird niemals null (höchstens "null") liefern.



Ich glaube der Fragesteller hat das begriffen. Siehe meine Posting vor diesem.


----------

