# JTable in *.dat schreiben und auslesen



## takkemi (29. Sep 2007)

Ja also das problem sieht so aus...

es sollen daten hinzugefügt werden in die Table und dann gespeichert.
diese daten sollen dann beim erneuten start der progs ausgelesen werden und wieder in die table geschrieben werden. auch jetzt soll man noch neue daten eintragen können und auch wieder speichern.


```
package myGui1;
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.util.Vector;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel;


public class Main extends JFrame implements TableData
{
  public static void main ( String[] args )
  {
	   
	  final JTextField eDatum, eDistanz, eZeit, eOrt;
		JButton bHinzu, bSave;
		JPanel panel = new JPanel(new GridLayout(1,5));
		JFrame frame = new JFrame("Daten");
				
				
				frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
				frame.setBounds(10, 10, 535, 500);
				frame.setLayout(new BorderLayout());
				
			
				eDatum = new JTextField("Datum");
				panel.add(eDatum);
				eDistanz = new JTextField("Distanz");
				panel.add(eDistanz);
				eZeit = new JTextField("Zeit(Min.)");
				panel.add(eZeit);
				eOrt = new JTextField("Ort");
				panel.add(eOrt);
				
				
				
				bHinzu = new JButton("Hinzufügen");
				panel.add(bHinzu);
				frame.add(BorderLayout.NORTH,panel);
				
				bSave = new JButton("Speichern");
				frame.add(BorderLayout.SOUTH,bSave);
				
				
				final DefaultTableModel model = new DefaultTableModel(columns, 0);
				JTable table = new JTable (model);
				
				try{
				FileInputStream fis = new FileInputStream("table.dat");
				ObjectInputStream o = new ObjectInputStream(fis);
				table =(JTable) o.readObject();}
				
				catch(ClassNotFoundException cnfe){
					System.err.println(cnfe);
				}
				catch(FileNotFoundException fnfe){
					System.err.println(fnfe);
					
				}
				
				catch(IOException ioe){
					System.err.println(ioe);
				}
				frame.add(BorderLayout.CENTER,(new JScrollPane(table)));
				
				
				bHinzu.addActionListener(new ActionListener(){
					public void actionPerformed(ActionEvent e){
						int size = model.getColumnCount();
						Vector newDatas = createDataVector(size,eDatum, eDistanz, eZeit, eOrt);
						model.addRow(newDatas);
					}});
				
				bSave.addActionListener(new ActionListener(){
					public void actionPerformed(ActionEvent e){
						OutputStream fos = null;
						
						try
						{
							fos = new FileOutputStream("table.dat");
							ObjectOutputStream o = new ObjectOutputStream(fos);
							
							o.writeObject (table);     //hier ist ein fehler, table kann nicht geschrieben werden wenn es nicht final ist
						}
						catch (IOException a)
						{System.err.println(a);}
						finally
						{
							try {fos.close();} catch(Exception a){}
						}
						}});
							                                 
				eDatum.addMouseListener(new MouseListener(){
					public void mouseEntered(MouseEvent e){
						
					}
					public void mousePressed(MouseEvent e){
						
					}
					public void mouseExited(MouseEvent e){
						
					}
					public void mouseClicked(MouseEvent e){
						eDatum.setText("");
					}
					public void mouseReleased(MouseEvent e){
						
					}
				});
				
				
		
			frame.setVisible(true);
	
  }
	  
  
  public static Vector createDataVector(int size, JTextField eDatum,JTextField 
		  eDistanz,JTextField eZeit,JTextField eOrt){
				  Vector vector = new Vector(size);
				  for (int i = 0; i<size; i++){
					  
					String text[]=new String[4];		  
					  switch (i){
					  case 0: text[0] = eDatum.getText();
					  case 1: text[1] = eDistanz.getText();
					  case 2: text[2] = eZeit.getText();
					  case 3: text[3] = eOrt.getText();
					  vector.add(text[i]);
					  
					  }
					  
				  }
				  return vector;
			}
 
  }
```


----------



## madboy (29. Sep 2007)

Wenn ich dich richtig verstanden habe, muss dein table final sein und alles ist gut.

Das würde so funktionieren:

```
final JTable table;
             
            try{ 
            FileInputStream fis = new FileInputStream("table.dat"); 
            ObjectInputStream o = new ObjectInputStream(fis); 
            table =(JTable) o.readObject();} 
             
            catch(ClassNotFoundException cnfe){ 
               System.err.println(cnfe); 
               table = new JTable (model); 
            } 
            catch(FileNotFoundException fnfe){ 
               System.err.println(fnfe); 
                table = new JTable (model); 
            } 
             
            catch(IOException ioe){ 
               System.err.println(ioe); 
                table = new JTable (model); 
            }
```

Allerdings ist das nicht die feine Art ;-)

Auch solltest du erwägen, mehrere Klassen zu verwenden und nicht alles in main() rein zu packen... Über kurz oder lang bekommst du sonst große Probleme.


----------



## takkemi (29. Sep 2007)

hi,

also nun ists so...

das table in den exceptions ist schon vergeben


----------



## takkemi (29. Sep 2007)

nachtrag

also wenn die table final ist kann ich sie speichern, wenn ichs dann wieder ändere und die daten eingelesen werden kann ich keine neuen hinzufügen vielleicht kannst du mir ja mal die feine art erklären


----------



## Guest (29. Sep 2007)

Erst mal sorry, das war nicht korrekt, was ich vorher geschrieben habe. Die Lösung wäre


```
public class Main extends JFrame implements TableData
{ 
    
    private static JTable table;
    
  public static void main ( String[] args )
... 
final DefaultTableModel model = new DefaultTableModel(columns, 0); 
table = new JTable (model);
...
```

das wäre zumindest nicht "unfein" ;-)

Mit "feiner Art" meinte ich, dass zumindest nicht alles final ist. Mach lieber Klassen-/Member-variablen wie im Beispiel oben das "private static JTable table;".

Ich kann dir hier leider keine Einführung in die objektorientierte Programmierung geben. Aber schau dir mal ein Java-Buch oder http://www.galileocomputing.de/openbook/javainsel6/ an.

In der FAQ des Forums hier findet sich übrigens auch ein JTable-Tutorial.


----------



## takkemi (30. Sep 2007)

so nun sieht die sache schon ganz gut aus

keine fehler mehr und nichts...nur eins...wenn man speichert...die datei wieder aufruft kann man keine neuen einträge hinzufügen das muss doch irgendwie klappen

aber schon mal vielen dank für die mühen!!!


----------



## André Uhres (30. Sep 2007)

Versuch mal nur das TableModel zu speichern.
Ausserdem ist XMLEncoder / XMLDecoder zum langzeitigen Speichern vorzuziehen.
Aus der JTable API:
*Warning:  Serialized objects of this class will not be compatible with future Swing releases. 
The current serialization support is appropriate for short term storage 
or RMI between applications running the same version of Swing. 
As of 1.4, support for long term storage of all JavaBeansTM  has been added to the java.beans package. 
Please see XMLEncoder.
*

```
package myGui1;

/*
 * Main.java
 */
import java.awt.*;
import java.awt.event.*;
import java.beans.XMLDecoder;
import java.beans.XMLEncoder;
import java.io.*;
import java.util.*;
import javax.swing.*;
import javax.swing.table.*;

public class Main extends JFrame implements ActionListener, MouseListener {

    private DefModel model;
    private JTable table;
    private JPanel panel;
    private JTextField eDatum;
    private JTextField eDistanz;
    private JTextField eZeit;
    private JTextField eOrt;
    private JButton bHinzu;
    private JButton bSave;
    private String filename = "table.xml";
    private String[] columns = {"Datum", "Distanz", "Zeit", "Ort"};

    public Main() {
        super("Daten");
        panel = new JPanel(new GridLayout(1, 5));
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(10, 10, 535, 500);
        setLayout(new BorderLayout());
        eDatum = new JTextField("Datum");
        panel.add(eDatum);
        eDistanz = new JTextField("Distanz");
        panel.add(eDistanz);
        eZeit = new JTextField("Zeit(Min.)");
        panel.add(eZeit);
        eOrt = new JTextField("Ort");
        panel.add(eOrt);
        bHinzu = new JButton("Hinzufügen");
        panel.add(bHinzu);
        add(BorderLayout.NORTH, panel);
        bSave = new JButton("Speichern");
        add(BorderLayout.SOUTH, bSave);
        model = new DefModel(columns, 0);
        table = new JTable();
        load();
        table.setModel(model);
        add(BorderLayout.CENTER, new JScrollPane(table));
        bHinzu.addActionListener(this);
        bSave.addActionListener(this);
        eDatum.addMouseListener(this);
    }

    public Vector createDataVector(final int size) {
        Vector<Object> vector = new Vector<Object>(size);
        for (int i = 0; i < size; i++) {
            switch (i) {
                case 0:
                    vector.add(eDatum.getText());
                    break;
                case 1:
                    vector.add(eDistanz.getText());
                    break;
                case 2:
                    vector.add(eZeit.getText());
                    break;
                case 3:
                    vector.add(eOrt.getText());
                    break;
            }
        }
        return vector;
    }

    private void save() {
        try {
            XMLEncoder o = new XMLEncoder(new BufferedOutputStream(new FileOutputStream(filename)));
            o.writeObject(model);
            o.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private void load() {
        XMLDecoder d = null;
        try {
            d = new XMLDecoder(new BufferedInputStream(new FileInputStream(filename)));
            model = (DefModel) d.readObject();
            table.setModel(model);
            d.close();
        } catch (FileNotFoundException ex) {
        }
    }

    public void actionPerformed(ActionEvent e) {
        Object source = e.getSource();
        if (source == bHinzu) {
            int size = model.getColumnCount();
            Vector newDatas = createDataVector(size);
            model.addRow(newDatas);
        }
        if (source == bSave) {
            save();
        }
    }

    public void mouseClicked(MouseEvent e) {
        Object source = e.getSource();
        if (source == eDatum) {
            eDatum.setText("");
        }
    }

    public void mousePressed(MouseEvent e) {
    }

    public void mouseReleased(MouseEvent e) {
    }

    public void mouseEntered(MouseEvent e) {
    }

    public void mouseExited(MouseEvent e) {
    }

    public static void main(final String... args) {
        SwingUtilities.invokeLater(new Runnable() {

            public void run() {
                new Main().setVisible(true);
            }
        });
    }
}
```


```
package myGui1;
/*
 * DefModel.java 
 * wird für XMLEncoder / XMLDecoder benötigt!
 */
import java.util.Vector;
import javax.swing.table.DefaultTableModel;
public class DefModel extends DefaultTableModel {
    public DefModel() {
        super();
    }
    public DefModel(Object[] columnHeaders, int rowCount){
        super(columnHeaders, rowCount);
    }
    public void setDataVector(Vector v) {
        dataVector = v;
    }
    public Vector getColumnIdentifiers(){
        return columnIdentifiers;
    }
}
```


----------



## takkemi (30. Sep 2007)

sehr geil!

vielen dank nun funktioniert alles!!!

danke danke


----------

