JTable in *.dat schreiben und auslesen

Status
Nicht offen für weitere Antworten.

takkemi

Mitglied
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.

Code:
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

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

Das würde so funktionieren:
Code:
           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

Mitglied
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:D
 
G

Guest

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

Code:
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

Mitglied
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

Top Contributor
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.
Code:
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);
            }
        });
    }
}
Code:
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;
    }
}
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
izoards JTable in CSV File schreiben... AWT, Swing, JavaFX & SWT 23
B Daten in eine JTable schreiben AWT, Swing, JavaFX & SWT 3
P Swing Alle Zeilen einer Spalte (jTable) zusammen zählen und in eine eigene Zeile das Ergebnis schreiben. AWT, Swing, JavaFX & SWT 7
G Text in JTable schreiben AWT, Swing, JavaFX & SWT 3
U Beste Möglichkeit JTable-Änderungen in DB zu schreiben? AWT, Swing, JavaFX & SWT 14
M Daten in JTable aus DB schreiben ? AWT, Swing, JavaFX & SWT 16
J Drag und drop aus einer JTable - bitte um Unterstützung AWT, Swing, JavaFX & SWT 2
S HPRO und UPRO gemeinsame JTABLE gemeinsamer RENDERER ? AWT, Swing, JavaFX & SWT 1
F Swing JTable - MultiHeader inkl. Eingabemöglichkeit AWT, Swing, JavaFX & SWT 1
S JTable - Feldinhalte anzeigen AWT, Swing, JavaFX & SWT 15
D Swing JTable Spaltenbreite AWT, Swing, JavaFX & SWT 1
W Gibt es einen "automatischen Listener" in Swing oder JTable oder der ATM-Klasse? AWT, Swing, JavaFX & SWT 14
G jTable - getSelectedRow() AWT, Swing, JavaFX & SWT 3
I JTable mit einem Button zu einer Detail Seite springen AWT, Swing, JavaFX & SWT 4
P JTable Listener für die Änderung einzelner Zellen oder Rows AWT, Swing, JavaFX & SWT 2
D Tastaturabfragen CTRL+t, CTRL+E bei eine JTable, bestehend aus JTextAteas AWT, Swing, JavaFX & SWT 4
P Checkboxes in JTable nicht editable AWT, Swing, JavaFX & SWT 9
F Best-Practise: JTable Text in Zelle zu groß AWT, Swing, JavaFX & SWT 2
Kohl Jedes Objekt einer JTable um ein Zeichen verkürzen AWT, Swing, JavaFX & SWT 7
I JTable, DefaultTableModel, zwei Zahlen multiplizieren. AWT, Swing, JavaFX & SWT 26
M JTABLE / wie oft wurde gewürfelt. AWT, Swing, JavaFX & SWT 1
F JTable vergrößern AWT, Swing, JavaFX & SWT 2
H JTable: Diverse NullPointer-Exceptions zur Laufzeit AWT, Swing, JavaFX & SWT 3
J Swing Werte des JTable werden nicht angezeigt AWT, Swing, JavaFX & SWT 9
T Swing JTable cellRenderer mit jpg Hintergrundfarbe lässt sich nicht ändern. AWT, Swing, JavaFX & SWT 1
HoT Einzelne Zelle in JTable Rahmen unten setzen AWT, Swing, JavaFX & SWT 24
B JTable Zellen zusammenfügen AWT, Swing, JavaFX & SWT 3
M Swing Cell Renderer für Zeilenumbruch in JTable AWT, Swing, JavaFX & SWT 0
H JTable im JSplitPane darstellen AWT, Swing, JavaFX & SWT 2
MadMax2506 Swing JTable lädt sehr lange AWT, Swing, JavaFX & SWT 1
D Zeilenumbruch in einer JTable AWT, Swing, JavaFX & SWT 9
R Swing JTable und Spaltenausrichtung AWT, Swing, JavaFX & SWT 8
G JTable füllen AWT, Swing, JavaFX & SWT 1
H JTable TableCellEditor-Problem AWT, Swing, JavaFX & SWT 0
W Swing JTable Zeilenumbruch innerhalb einer Zelle AWT, Swing, JavaFX & SWT 3
J Datensatz in jTable ausgeben AWT, Swing, JavaFX & SWT 3
M Swing Automatischer Editorstart in JTable-Zelle AWT, Swing, JavaFX & SWT 5
ralfb1105 Swing JTable aktualisieren AWT, Swing, JavaFX & SWT 5
adiko01 JTable: Nur markierte Zeilen aus der Tabelle in CSV exportiern AWT, Swing, JavaFX & SWT 9
M JTable.setDefaultRenderer(...) greift nicht AWT, Swing, JavaFX & SWT 0
J JTable: Eingabe in Tabellenzelle korrigieren AWT, Swing, JavaFX & SWT 4
T Problem mit JTable Sortierung AWT, Swing, JavaFX & SWT 2
D JTable nach INSERT aktualisieren /refreshen AWT, Swing, JavaFX & SWT 1
D MySQL Daten in JTable anzeigen AWT, Swing, JavaFX & SWT 2
H Swing Jtable extra spalte AWT, Swing, JavaFX & SWT 6
S Swing Rechteck über JTable zeichnen (per MouseListener) AWT, Swing, JavaFX & SWT 1
S Swing Mal wieder JTable Ansicht aktualisieren AWT, Swing, JavaFX & SWT 10
A JTable mit Daten füllen AWT, Swing, JavaFX & SWT 1
VfL_Freak Swing Einzelne Zeile in jTable selektieren klappt nicht AWT, Swing, JavaFX & SWT 7
N AWT jTable CellRenderer AWT, Swing, JavaFX & SWT 6
T Swing JTable valueChanged datensatz löschen AWT, Swing, JavaFX & SWT 1
0 Swing JTable aus anderer Klasse updaten AWT, Swing, JavaFX & SWT 5
S Jtable defaultRenderer wohin damit ? AWT, Swing, JavaFX & SWT 23
T Swing JTable / FocusListener AWT, Swing, JavaFX & SWT 0
it_is_all Warum wird die JTable im JDialog nicht angezeigt? AWT, Swing, JavaFX & SWT 1
L Swing JTable im Panel darstellen AWT, Swing, JavaFX & SWT 8
T Swing Double Click bei Buttons in JTable AWT, Swing, JavaFX & SWT 9
J addRow bei JTable AWT, Swing, JavaFX & SWT 6
M Jtable gibt -1 wert bei selectedRow und Column AWT, Swing, JavaFX & SWT 3
Meeresgott Swing JTable AWT, Swing, JavaFX & SWT 4
J JTable Selection Listener funktioniert nicht AWT, Swing, JavaFX & SWT 4
C Swing Daten in JTable wiedergeben per TableModel und MVC Pattern AWT, Swing, JavaFX & SWT 16
Z Swing Drag&Drop zwischen JTable und JTree AWT, Swing, JavaFX & SWT 4
Thallius JTable dynamisch Spaltenanzahl verändern AWT, Swing, JavaFX & SWT 2
Thallius JTable dynamisch laden? AWT, Swing, JavaFX & SWT 2
B Swing JTable sortieren AWT, Swing, JavaFX & SWT 2
T Swing JTable auslesen und befüllen AWT, Swing, JavaFX & SWT 8
B JTable wird nicht angezeigt AWT, Swing, JavaFX & SWT 1
J JTable und Suchlogik AWT, Swing, JavaFX & SWT 4
Viktim Swing JTable mit Tab verlassen AWT, Swing, JavaFX & SWT 1
F Swing Spaltenbreite einer Column eines JTable auslesen AWT, Swing, JavaFX & SWT 5
Viktim Swing JTable Mit Tab druch Zeilen Wechseln AWT, Swing, JavaFX & SWT 5
Thallius Warum refrehsed mein JTable nicht? AWT, Swing, JavaFX & SWT 5
Ghostman1711 Hinzufügen ausgewählter Dateinen des Filechoosers zu einem JTable AWT, Swing, JavaFX & SWT 9
S Swing JTable - Einzelne Rows einfärben AWT, Swing, JavaFX & SWT 11
M Wert einer Zelle aus JTable ziehen AWT, Swing, JavaFX & SWT 4
K JTable getValueAt() klappt nicht immer AWT, Swing, JavaFX & SWT 1
K JTable in extra Klasse, Zugriff in einer anderen klasse nicht möglich AWT, Swing, JavaFX & SWT 26
B Swing Tabelle(JTable) filtern swing GUI AWT, Swing, JavaFX & SWT 3
P JTable - bei Eingabe Selektion AWT, Swing, JavaFX & SWT 0
P Fokus auf Zelle in JTable AWT, Swing, JavaFX & SWT 1
S Swing Deselektion in JTable verhindern AWT, Swing, JavaFX & SWT 0
D Problem mit JTable AWT, Swing, JavaFX & SWT 1
N Swing Print JTable mit AbstractTableModel AWT, Swing, JavaFX & SWT 1
Ananaskirsche Swing jTable Reihen zuviel eingefügt AWT, Swing, JavaFX & SWT 12
P im JTable die Schriftfarbe ändern AWT, Swing, JavaFX & SWT 19
T Swing JTable wird nicht angezeigt AWT, Swing, JavaFX & SWT 4
S Dreiecke in bestimmte Zellen einer JTable AWT, Swing, JavaFX & SWT 9
LexeB4F Zelle in JTable gezielt einfärben AWT, Swing, JavaFX & SWT 4
LexeB4F JTable mehrere Zelle selektieren und inhalte Löschen.. Ideen gesucht AWT, Swing, JavaFX & SWT 1
D Swing JTable Renderer Grafikfehler AWT, Swing, JavaFX & SWT 0
K Swing JTable mit ImageIcon und Text in einer Zelle AWT, Swing, JavaFX & SWT 1
M Swing JTable GroupableHeader Background Color AWT, Swing, JavaFX & SWT 4
K Swing JTable updaten AWT, Swing, JavaFX & SWT 9
thet1983 Swing MySQL >> JTable AWT, Swing, JavaFX & SWT 5
J JTable bounds ändern durch resizing des Fensters AWT, Swing, JavaFX & SWT 9
F JTable Zellen-Hintergrund ändern AWT, Swing, JavaFX & SWT 7
O JTable linksbündig drucken (nicht der Zelleninhalt) AWT, Swing, JavaFX & SWT 2
Crazynet xls Datei in JTable AWT, Swing, JavaFX & SWT 3
O JTable ohne Rahmen printen AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen


Oben