# Text im textfeld in einem Editor anzeigen



## guguli (6. Mai 2014)

Hallo zusammen,

ich hab eine Gui erstellt wo drin ich mehrere Textfelder und einen Button habe. Nun möchte ich wenn ich in einem textfeld was eintippe und dann auf den button klicke, dieser text dann in einem txt datei anzeigen lassen. 

Hat einer vllt. einen Tipp wie ich sowas realisieren kann???


THX


----------



## Zhorky (6. Mai 2014)

Hallo,
Eigentlich würde ich dich gerne auf eine wunderbare Seite namens Google hinweisen.
Doch da ich kein Unmensch bin hier direkt das Suchergebnis:
Java Text in eine Datei schreiben :: Ein Karlsruher Bloggt!

Ich hoffe Ich konnte dir damit helfen.
Liebe Grüße,
Zhorky


----------



## guguli (6. Mai 2014)

Danke für deinen Hinweis auf Google ....
aber dein Link ist nicht das was ich möchte. Wie ich eine Datei Öffne und bearbeiten kann ist mir schon klar 
ICh möchte die Veränderungen in meiner GUI in die Datei Übernehmen.

Angenommen die GUI sieht so aus
XXXX = 4444

woberi XXXX ein label ist und 4444 Textfield.
Irgendwo in der txt datei habe ich diese zeiel. Nun will ich wenn ich die 4444 zu 3333 ändere und dann den Button klicke, dann in der txt Datei auch diese Veränderung übernommen wird.

Ich hoffe jetzt ist es klar 

Gruß


----------



## Joose (6. Mai 2014)

Verwende 
	
	
	
	





```
getText()
```
 von JTextField. Du weißt ja anscheinend wie du eine Datei öffnest und diese zeilenweise durchgehst. Dann musst du nur noch die entsprechende Zeile suchen und den gewünschten Text per 
	
	
	
	





```
replace()
```
 von der Klasse String ersetzen!


----------



## guguli (6. Mai 2014)

Hi,

```
getText()
```
 hab ich schon gefunden! 
Ich hab ja mehr als ein Texfield. zum Beispiel ich hab 60 text fields.
Nun will ich alle textfields durchgehen und alles was da drin steht in einem String array speichern. 
Ich weiss aber nicht wie ich die alle durch gehen kann. 
Mein code wie ich die textfields erzeugt habe sieht so aus:

```
static JTextField valueEingabe[] = null;
if(valueEingabe==null){
			valueEingabe = new JTextField[DataRead.längeDerParameter];
		}
valueEingabe[i] = new JTextField(valueArray.get(j));
				gbc.gridx=1;
				gbc.gridy=0+i;
				gbc.weightx = 3;
				panel_to_add.add(valueEingabe[i],gbc);
```
dazugehört noch mehr, hab nur das wichtigste gepostet.

THX


----------



## Joose (7. Mai 2014)

Ja wie es scheint speicherst du die JTextFields eh alle in einem Array! Was spricht dagegen dieses Array durchzugehen und von jedem JTextField getText() aufzurufen?


----------



## guguli (7. Mai 2014)

Ich hab ja das so gemach, kriege aber ne Fehlermeldung.
Das ist mein Code:

```
public  void createLabel(JPanel panel_to_add, ArrayList<String> parameterArray, ArrayList<String> valueArray)
	{
		
		if(labels==null){
			labels = new JLabel[DataRead.längeDerParameter];
		}
		if(valueEingabe==null){
			valueEingabe = new JTextField[DataRead.längeDerParameter];
		}
		for(int i = 0,  j =0; i<parameterArray.size();i++){
			
			labels[i] = new JLabel (parameterArray.get(i), JLabel.TRAILING);
			
			gbc.fill = GridBagConstraints.HORIZONTAL;
			gbc.insets = new Insets(2,2,2,2);
			gbc.gridx=0;
			gbc.gridy=0+i;
			panel_to_add.add(labels[i],gbc);
			if(!parameterArray.get(i).startsWith("[")){
				valueEingabe[i] = new JTextField(valueArray.get(j));
				gbc.gridx=1;
				gbc.gridy=0+i;
				gbc.weightx = 3;
				panel_to_add.add(valueEingabe[i],gbc);
				j++;
				anzahltextfield++;
				textFeldEingaben.add(valueEingabe[i].getText());
			}
			zeile =i;
		}	
		System.out.println(anzahltextfield);
		System.out.println(textFeldEingaben);
	}
	
	public void createButton(JPanel panel_to_add)
	{
		gbc.gridx=0;
		gbc.gridy=zeile+1;
		gbc.weightx = 3;
		panel_to_add.add(convert, gbc);
	
		convert.addActionListener(new ActionListener() 
		{
			
			public void actionPerformed(ActionEvent e) 
			{
				//Datei Öffnen
				try{
					  Desktop desktop = Desktop.getDesktop();
					  desktop.edit(new File("D:/eclipse/IKV/Example_Input2.txt"));
					}catch (Exception exp){

					}
				
				for(int i = 0; i<anzahltextfield;i++){
					textFeldEingaben.add(valueEingabe[i].getText());
				}
				System.out.println(textFeldEingaben);
			}
		});
	
	}
```
und die Fehlermeldung ist dann:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException


----------



## Joose (7. Mai 2014)

Nach der Exception kommt noch der StackTrace. Dieser ist ebenfalls sehr hilfreich 

Eine NullPointerException (NPE) bekommst du wenn auf ein Attribut oder eine Methode eines nicht vorhandenen Objekts zugreifen willst. Der StackTrace zeigt dir genau die Zeile wo die Exception passiert.

Was mir noch aufgefallen ist am Code: 
Vermeide Umlaute im Code! Das kann und wird später zu Problemen führen (Achtung, Texte auf der GUI können diese natürlich enthalten)
Vermeide "_" für Bezeichner sondern verwende die CamelCase (upper und lower) Schreibweise


----------



## guguli (8. Mai 2014)

Hi danke erst mal, ich hab das Problem gelöst!!

Nun hab ich eine andere Frage :
Ich hab eine ganz normalen IF abfrage, verstehe aber nicht wieso die dann nicht funktioniert:


```
for(int i=0; i<valueArray.size();i++){
					if(textFeldEingaben.get(i)!=valueArray.get(i)){
					//	System.out.println(textFeldEingaben.get(i));
					//	System.out.println(valueArray.get(i));
						DataRead.ersetze(textFeldEingaben.get(i));
					}
				}
```
ich möchte gern wenn der Inhalt diesen beiden Arrays verschieden ist dann die Methode ersetze aufrufen.
Wobei die Arrays sind ArrayList<String>, deswegen get(i)
Das Problem ist dass bei jedem i auch wenn die gleich sind in die IF abfrage gehe und und die Methode erstze aufrufe.

wo mach ich denn den Fehler????


----------



## Joose (8. Mai 2014)

guguli hat gesagt.:


> Hi danke erst mal, ich hab das Problem gelöst!!



Und die Lösung ist? Anderen mit ähnlichen Problemen könnte es ebenfalls helfen!



guguli hat gesagt.:


> ```
> if(textFeldEingaben.get(i)!=valueArray.get(i)){
> ```



Hier liegt dein Problem. Strings werden nicht mit == (bzw. !=) verglichen.


----------



## guguli (8. Mai 2014)

Hi, ich hab das auch so probiert :

```
for(int i=0; i<valueArray.size();i++){
					jetzt= textFeldEingaben.get(i);
					vorher = valueArray.get(i);
					if(!jetzt.equals(vorher)){}}
```
ich gehe trotzdem in die IF abfrage rein, obwohl die werte bzw. die Strings unterschiedlich sind.


----------



## Joose (8. Mai 2014)

guguli hat gesagt.:


> Hi, ich hab das auch so probiert :
> 
> ```
> for(int i=0; i<valueArray.size();i++){
> ...



Lass dir die Strings vor dem if Ausgeben (Console oder Log). Und zeige den Code her wie er aktuell ist. Mit dem Code oben kann er nur in das if gehen wenn die 2 Strings vom Inhalt unterschiedlich sind.


----------



## guguli (8. Mai 2014)

Also der Code ist im Mom so:

```
public class Gui  {

	
//	private static final long serialVersionUID = 1L;	
	int x=0, y=0, width=800, height = 600;

	int zeile =0;
	int anzahltextfield=0;
	String[] textField;
	static JLabel labels[] = null;
	static JTextField valueEingabe[] = null;
	static JPanel panel = new JPanel();
	static JPanel panel2 = new JPanel();
	static JPanel panel3 = new JPanel();
	static GridBagLayout gbl=new GridBagLayout();
	static GridBagConstraints gbc=new GridBagConstraints();
	
	 JButton convert = new JButton("Convert");  
	 JButton save = new JButton("save"); 

	static BoxLayout boxLayout = new BoxLayout(panel, BoxLayout.X_AXIS);

	public static ArrayList<String> parameterArray = DataRead.getParameterArray();
	public static ArrayList<String> valueArray = DataRead.getValueArray();
	public static ArrayList<String> textFeldEingaben = new ArrayList<String>();

	public Gui(){

		JDialog meinJDialog = new JDialog();

		panel2.setLayout(gbl);
	    panel3.setLayout(gbl);
		panel.setLayout(boxLayout);
		
		this.createLabel(panel2, parameterArray, valueArray);
		this.createButton(panel2, valueArray);
		
		panel.add(panel2);
		panel.add(panel3);
		
		Toolkit tk = Toolkit.getDefaultToolkit();
		Dimension dim = tk.getScreenSize();
		
		x = (int) ((dim.getWidth()-width)/2);
		y = (int) ((dim.getHeight()-height)/2);
		
		meinJDialog.setTitle("GUI");
		meinJDialog.setBounds(0, 0, 800, 600);

		
		 JScrollPane scrollPane = new JScrollPane (panel, 
		            ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
		            ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);

//		        // JScrollPane wird dem Dialog hinzugefügt
		 meinJDialog.add(scrollPane);
//		        // Wir lassen unseren Dialog anzeigen
		 meinJDialog.setVisible(true);

	}
	

	
	public  void createLabel(JPanel panel_to_add, ArrayList<String> parameterArray, ArrayList<String> valueArray)
	{
		
		if(labels==null){
			labels = new JLabel[DataRead.längeDerParameter];
		}
		if(valueEingabe==null){
			valueEingabe = new JTextField[DataRead.längeDerParameter];
		}
		for(int i = 0,  j =0; i<parameterArray.size();i++){
			
			labels[i] = new JLabel (parameterArray.get(i), JLabel.TRAILING);
			
			gbc.fill = GridBagConstraints.HORIZONTAL;
			gbc.insets = new Insets(2,2,2,2);
			gbc.gridx=0;
			gbc.gridy=0+i;
			panel_to_add.add(labels[i],gbc);
			if(!parameterArray.get(i).startsWith("[")){
				valueEingabe[j] = new JTextField(valueArray.get(j));
				gbc.gridx=1;
				gbc.gridy=0+i;
				gbc.weightx = 3;
				panel_to_add.add(valueEingabe[j],gbc);
				j++;
				anzahltextfield++;
			}
			zeile++;
		}	
		System.out.println("valuearray:"+valueArray);

	}
	
	public void createButton(JPanel panel_to_add, final ArrayList<String> valueArray)
	{
		gbc.gridx=0;
		gbc.gridy=zeile+1;
		gbc.weightx = 3;
		panel_to_add.add(convert, gbc);
		
		gbc.gridx=1;
		gbc.gridy=zeile+1;
		gbc.weightx = 3;
		panel_to_add.add(save, gbc);
	
		
		save.addActionListener(new ActionListener() 
		{
			
			public void actionPerformed(ActionEvent e) 
			{
				for(int i = 0; i<anzahltextfield;i++){
					textFeldEingaben.add(valueEingabe[i].getText());
				}
				System.out.println("textfieldeingabe:"+textFeldEingaben);
				
			}

		});
		
		convert.addActionListener(new ActionListener() {
			
			public void actionPerformed(ActionEvent e ) {
				String jetzt ;
				String vorher;
				for(int i=0; i<valueArray.size();i++){
					jetzt= textFeldEingaben.get(i);
					vorher = valueArray.get(i);
					if(!jetzt.equals(vorher)){
						System.out.println(textFeldEingaben.get(i));
						System.out.println(valueArray.get(i));
						DataRead.ersetze(textFeldEingaben.get(i));
					}
				}
				try{
					  Desktop desktop = Desktop.getDesktop();
					  desktop.edit(new File("D:/eclipse/IKV/Example_Input.txt"));
					}catch (Exception exp){

					}
				
			}
		});
	
	}

	public static void main(String[] args) {
		DataRead.speichern();
		new Gui();
	     
	}
}
```

Ich hab zwei arrayList<String>, eine hat [23]  als Element und die andere [2345], ich will nur dann da rein gehen, wenn die werte die als String gespeichert sind nicht göleich sind, denn ich möchte dann später 2345 für 23 ersetzen.


----------



## Joose (9. Mai 2014)

Der Code schaut eigentlich richtig aus. Mit den ganzen static zwar *sehr* unschön aber richtig.

Hast du schon mal den Debugger angeworfen und geschaut was du miteinander vergleichst?
(Konsolenausgaben könntest du auch machen)


----------



## guguli (9. Mai 2014)

ok, es klappt jetzt so wie ich das möchte .

Ich möchte nun den wert in der txt datei durch einen anderen ersetze.

Ich dachte ich kann das so machen.

```
public static void ersetze(String string) {
		File file = new File("D:/eclipse/IKV/Example_Input.txt");
		String vorher;
		String[] value;
		BufferedReader in = null;
		
		try{
			in = new BufferedReader(new FileReader(file));
			String zeile = null;
			while((zeile=in.readLine())!= null)
			{
				if(!zeile.startsWith("#"))
				{
					if(!zeile.startsWith("["))
					{
						if(zeile.contains("="))
						{
							value = zeile.split("=");
							if(value[1] != string){
								vorher=zeile.substring(zeile.indexOf("="), zeile.length());
								vorher.replace(vorher, string);
							}
						}
					}
				}					
			}			
		}catch (IOException e){
			e.printStackTrace();
		}finally {
			if(in!=null)
				try{
					in.close();
				}catch (IOException e){
					
				}
		}
		
	}
```
aso ganzeinfach, die datei zeilenweise einlesen und dann halt vergleichen  und dann replace. Aber das tut es nicht. 
Hab auch debugg gemacht die werte sind unterscheidlich. ichglaub die Methode replace ist nicht richtig  oder??

Was kann ich sonst nehmen??
THX


----------



## Joose (9. Mai 2014)

guguli hat gesagt.:


> ```
> .......
> if(!zeile.startsWith("#"))
> {
> ...



Das Problem besteht auf der einen Seite in der 4.if-Abfrage .... strings werden nicht mit == oder != verglichen.
Auf der anderen Seite hast du nicht beachtet das String immutable sind, sprich ein String Objekt kann nicht geändert werden.
Die Methode "replace" ändert nicht den vorhandenen String sondern gibt dir einen neuen zurück!


----------



## guguli (9. Mai 2014)

Und wie kann ich das denn realisieren???
Cih weiss die Frage ist dumm , aber mir fällt da nicht ein!!!


----------



## Joose (9. Mai 2014)

guguli hat gesagt.:


> Und wie kann ich das denn realisieren???



Wie schon gesagt 
	
	
	
	





```
replace(String, String)
```
 gibt dir den geänderten String zurück!
Diesen musst du doch nur noch speichern, wo liegt das Problem?


----------



## guguli (10. Mai 2014)

Also meinstemit speichern da rein schreiben. Sowas wie BufferedWriter??

wenn ja ich hab da so gemacht tut es trotzdem nicht 

```
public static void ersetze(String string) throws IOException {
		File file = new File("D:/eclipse/IKV/Example_Input2.txt");
		String vorher;
		String[] value;
		BufferedReader in = null;
		BufferedWriter w = null;
		try{
			in = new BufferedReader(new FileReader(file));
			w = new BufferedWriter(new FileWriter(file));
			String zeile = null;
			while((zeile=in.readLine())!= null)
			{
				if(!zeile.startsWith("#"))
				{
					if(!zeile.startsWith("["))
					{
						if(zeile.contains("="))
						{
							value = zeile.split("=");
							if(value[1].equals(string)){
								vorher=zeile.substring(zeile.indexOf("="), zeile.length());
//								value[1].replace(vorher, string);
								w.write(value[1].replace(vorher, string));
								
							}
						}
					}
				}					
			}			
		}catch (IOException e){
			e.printStackTrace();
		}finally {
			if(in!=null)
				try{
					in.close();
					w.close();
				}catch (IOException e){
					
				}
		}
		
	}
```


----------

