# Daten aus einer JTable in einer Datei speichern



## hannes68 (30. Sep 2004)

ich möchte gerne daten aus einer jtable speichern

```
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.StringTokenizer;
import java.util.Vector;

import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JScrollPane;
import javax.swing.JTable;

/*
 * Created on 28.09.2004
 *
 * TODO To change the template for this generated file go to
 * Window - Preferences - Java - Code Style - Code Templates
 */

/**
 * @author hannes68
 *
 * TODO To change the template for this generated type comment go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
public class Editor {

	public static void main( String[] args )throws IOException 
	{ 


	BufferedReader eingabe = new BufferedReader(new FileReader("xyz.txt")); 
	int gelesen; 
	String eingabezeile; 
	BufferedWriter ausgabe = new BufferedWriter(new FileWriter("xyz2.txt")); 
    FileWriter fw = new FileWriter( "fileWriter.txt" ); 
	eingabezeile=eingabe.readLine(); 

	Vector input = new Vector(); // #### in diesem Vector speichern 

	while( eingabezeile != null ) 
	{ 
		StringTokenizer token= new StringTokenizer (eingabezeile); 

		String[] felder =eingabezeile.split("\\|"); 

		StringBuffer text =new StringBuffer(10); 
		input.add( felder ); 
		eingabezeile=eingabe.readLine(); 

	} 


	JMenuBar leiste=new JMenuBar(); 
	JMenu menu1 =new JMenu("Datei"); 
	JMenuItem item1 =new JMenuItem("Laden"); 
	JMenuItem item2=new JMenuItem("Speichern"); 
	menu1.add(item1); 
	menu1.add(item2); 
	leiste.add(menu1); 
    String label;
    

	Object rowData[][] = (Object[][])input.toArray( new Object[ input.size() ][] ); 

	String columnNames[] = { }; 



	JTable table = new JTable( rowData, columnNames ); 
	JFrame frame = new JFrame(); 

	frame.getContentPane().add( new JScrollPane(table) ); 
	table.setAutoResizeMode( JTable.AUTO_RESIZE_OFF ); 
	frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); 
	frame.pack(); 
	frame.setVisible( true ); 
	frame.setJMenuBar(leiste); 
	table.setAutoCreateColumnsFromModel(false); 
	
	System.out.println("Rows: " + Integer.toString(table.getRowCount())); 
    System.out.println("Cols: " + Integer.toString(table.getColumnCount())); 
    System.out.println("--------------------"); 
	
    
    int x = 0; 
    int y = 0; 
    String sLine = ""; 
    
    while (y < table.getRowCount()) 
    { 
        while (x < table.getColumnCount())            
        { 
            sLine += table.getValueAt(y, x); 
            sLine += "|"; 
            x++; 
        } 
        ausgabe.write(Integer.toString(y) + ": " + sLine); 
        sLine = ""; 
        y++; 
        x = 0; 
        
    }
    
    
      
      
	}
}
```

gespeichert wird ja auch in einer datei aber leider nicht die veränderten daten in der Jtable


----------



## dotlens (30. Sep 2004)

was wird denn gsepeichert?


----------



## hannes68 (30. Sep 2004)

das was ich mit 
	
	
	
	





```
BufferedReader eingabe = new BufferedReader(new FileReader("xyz.txt"));
```
 reinlade


----------



## hannes68 (30. Sep 2004)

ich weis schon das speichern muss bei dem menüklick ausgeführt werden
nur geht das leider nicht den wenn ich das

```
int x = 0; 
    int y = 0; 
    String sLine = ""; 
    
    BufferedWriter ausgabe = new BufferedWriter(new FileWriter("DYN_cyclist2.txt")); 

    while (y < table.getRowCount()) 
    { 
        while (x < table.getColumnCount())            
        { 
            sLine += table.getValueAt(y, x); 
            sLine += "|"; 
            x++; 
        } 
        ausgabe.write(sLine); 
        sLine = ""; 
        y++; 
        x = 0; 
        ausgabe.flush(); 
    } 
    ausgabe.flush(); 
    ausgabe.close();
```

hier einfüge:

```
ActionListener al = new ActionListener() {
        public void actionPerformed( ActionEvent e )
        {
        
        	System.out.println("test");

        
        }
    };
    item2.addActionListener( al );
```

dann gibt es ja die table variable nicht mehr weil es ja nicht public ist
was soll ich jetzt machen??


----------



## hannes68 (30. Sep 2004)

mensch weis den keiner eine antwort??
ich muss !! das bis morgen fertig haben 
bitte bitte helft mir


----------



## Beni (30. Sep 2004)

So... ein Programm besteht aus mehreren Methoden und einigen Variablen.

Hier eine *ungetestete* Version, wie solch ein Programm einfacher aufgebaut wird:


```
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.StringTokenizer;
import java.util.Vector;

import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;


public class Editor extends JFrame{
	private JTable table;
	
	public static void main( String[] args ){
		Editor editor = new Editor();
		editor.setVisible( true );
	}
	
	public Editor(){
		super( "Tabelle" );
		
		JMenuBar leiste=new JMenuBar();
		JMenu menu1 =new JMenu("Datei");
		JMenuItem load =new JMenuItem("Laden");
		JMenuItem write =new JMenuItem("Speichern");
		menu1.add(load);
		menu1.add(write);
		leiste.add(menu1);
		String label;
		
		table = new JTable();
		//table.setAutoCreateColumnsFromModel(false);
		getContentPane().add( new JScrollPane(table) );
		table.setAutoResizeMode( JTable.AUTO_RESIZE_OFF );
		setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
		setJMenuBar(leiste);
		pack();
		
		load.addActionListener( new ActionListener(){
			public void actionPerformed(ActionEvent e) {
				read();
			}
		});
		
		write.addActionListener( new ActionListener(){
			public void actionPerformed(ActionEvent e) {
				write();
			}
		});
	}
	
	private void read(){
		try{
			BufferedReader eingabe = new BufferedReader(new FileReader("xyz.txt"));
			int gelesen;
			String eingabezeile;

			eingabezeile=eingabe.readLine();

			Vector input = new Vector(); // #### in diesem Vector speichern

			while( eingabezeile != null )
			{
				StringTokenizer token= new StringTokenizer (eingabezeile);

				String[] felder =eingabezeile.split("\\|");

				StringBuffer text =new StringBuffer(10);
				input.add( felder );
				eingabezeile=eingabe.readLine();
		   }
		   
			Object rowData[][] = (Object[][])input.toArray( new Object[ input.size() ][] );

			String columnNames[] = { };

			table.setModel( new DefaultTableModel( rowData, columnNames ));
		}
		catch( IOException ex ){
			ex.printStackTrace();
		}
	}
	
	private void write(){
		try{
		   BufferedWriter ausgabe = new BufferedWriter(new FileWriter("xyz2.txt"));
		   FileWriter fw = new FileWriter( "fileWriter.txt" );
		
		   int x = 0;
		   int y = 0;
		   String sLine = "";
	   
		   while (y < table.getRowCount()){
		   		while (x < table.getColumnCount()){
		   			sLine += table.getValueAt(y, x);
		   			sLine += "|";
		   			x++;
		   		}
		   		ausgabe.write(Integer.toString(y) + ": " + sLine);
		   		sLine = "";
		   		y++;
		   		x = 0;
		   }
		}
		catch( IOException ex ){
			ex.printStackTrace();
		}
	}
}
```


----------



## Beni (30. Sep 2004)

```
public class StringTableModel extends DefaultTableModel{
   public StringTableModel( Object[][] data, String[] names ){
      super( data, names );
   }

   // Eine Angabe, welchen Typ von Objekten in den Columns angezeigt werden soll
   public Class getColumnClass(int columnIndex) {
      return String.class;
   }

   // Jede Zelle ist editierbar
   public boolean isCellEditable(int rowIndex, int columnIndex) {
      return true;
   }
}
```


----------



## P3AC3MAK3R (1. Okt 2004)

@hannes68:
Bitte Boardregeln beachten:



> Aussagekräftige Titel verwenden! Es nervt nur, wenn ihr z. B. schreibt "Suche Hilfe". Eine gute kurze Beschreibung eures Problems hilft euch viel eher weiter.



Titel präzisiert.


----------



## hannes68 (1. Okt 2004)

@beni
es funktioniert zwar alles so wie ich es wollte aber ich brächte trotzdem mal rat wie man eine suchfunktion einbauen kann  
es soll nach strings in der jtable gesucht werden welche sich in der 4.zelle befinden

thanks


----------



## Beni (1. Okt 2004)

Nimm ein JTextField, und füg ihm ein ActionListener hinzu. Wann immer der User nun "ENTER" drückt, wird dieser Listener angesprochen, und du kannst den eingegebenen Text (textField.getText) mit dein Einträgen in der Tabelle vergleichen. (am besten String.startsWith... verwenden). Das Ergebnis kannst du dann irgendwohin schreiben, z.B. gleich in die Tabelle. (Die Originaldaten solltest du dann allerdings als Variable speichern, damit du schnell wieder alles anzeigen kannst).


----------



## hannes68 (1. Okt 2004)

gibt es auch ne möglichkeit das die erste zeile im der datei nicht ausgelesen wird??
oder besser:
die erste zeile in der textdatei muss immer oben stehen bleiben durch das sotieren wird es aber bei g eingefügt(was ja logisch ist  )


----------

