Problem mit Serialisierung von jTable

wottpal

Mitglied
Hi,
ich wollte meine 2 jTables serialisieren und speichern, da sich auch z.B. Spalten-/Zeilenbreite ändern, muss ich neben dem DefaultTableModel auch das TableColumnModel serialisieren, nur damit keine Fragen auftreten.
Wenn ich den unten aufgeführten Quelltext ausführe funktioniert alles wunderbar, kann auch alles wieder deserialisieren ohne Fehler. Doch wenn ich zum 2. mal speichern will (ohne etwas gemacht zu haben) kommt die Fehlermeldung:
Java:
java.io.NotSerializableEception: com.sun.java.swing.plaf.windows.WindowsTableHeaderUI
Wie kann ichs jetzt verhindern, dass der diesen WindowsTableHeaderUI-Dünsch mit serialisiert, brauch ich doch bestimmt sowieso nicht..

Quelltext:
Java:
    public void save() throws IOException {
	if (jTable1.getCellEditor() != null && !jTable1.getCellEditor().stopCellEditing()) {
            jTable1.getCellEditor().cancelCellEditing();
        }
        if (jTable2.getCellEditor() != null && !jTable2.getCellEditor().stopCellEditing()) {
            jTable2.getCellEditor().cancelCellEditing();
        }
        jTable1.requestFocusInWindow();
        jTable2.requestFocusInWindow();
		
        try {
            String filename = "filename";
            if (jFileChooser1.showSaveDialog(jMenu1) == JFileChooser.APPROVE_OPTION) {
                filename = jFileChooser1.getSelectedFile().toString();
                if (!filename.endsWith(".turing")) {
                    filename += ".turing";
                }

                FileOutputStream file = new FileOutputStream(filename);
                ObjectOutputStream o = new ObjectOutputStream(file);

                // jTable1
                DefaultTableModel model1 = cloneModelWithoutListeners((DefaultTableModel) jTable1.getModel());
                TableColumnModel cModel1 = jTable1.getColumnModel();
                o.writeObject(model1);
                o.writeObject(cModel1);

                // jTable2
                DefaultTableModel model2 = cloneModelWithoutListeners((DefaultTableModel) jTable2.getModel());
                TableColumnModel cModel2 = jTable2.getColumnModel();
                o.writeObject(model2);
                o.writeObject(cModel2);
                
                o.close();
            }
        } catch (IOException e) {
            System.err.println(e);
        }
    }
	
    // Entfernt unötige Listener, die nicht mit serialisiert werden müssen
    public DefaultTableModel cloneModelWithoutListeners(
            DefaultTableModel orgModel) {
        final Vector<?> clonedData = (Vector<?>) orgModel.getDataVector().clone();
        final int columnCount = orgModel.getColumnCount();
        final Vector<String> columnNames = new Vector<String>(columnCount);
        for (int i = 0; i < columnCount; i++) {
            columnNames.add(orgModel.getColumnName(i));
        }
        return new DefaultTableModel(clonedData, columnNames);
    }

Vielen Dank im Voraus, wottpal :)
 
S

SlaterB

Gast
ansonsten überlege, die Spaltenbreiten und was immer noch fehlt auch im TableModel abzulegen,
du braust ja eh individuellen Code um das ColumnModel auszulesen und zuzuweisen,
an dieser Stelle könnte auch saubere Initialisierung stehen
 

bERt0r

Top Contributor
Also bei mir funktioniert
Java:
o.writeObject(jTable1.getModel());
o.writeObject(jTable1.getColumnModel());
einwandfrei. Über den Sinn der ganzen clonerei wegen seine Listeners lässt sich vielleicht streiten.
Zum ColumnModel gehören aber neben Spaltenbreiten auch die Reihenfolge der Spalten afaik.

Edit: Anscheinend doch keine optimale Lösung. Sauberer ist es, einfach beim TableModel writeObject und readObject zu überschreiben, damit nicht alle abhängigen GUI elemente wie Listeners etc mitserialisiert werden. z.B:

Java:
table.setModel(new DefaultTableModel(
			new Object[][] {
				{"Sepp",new Integer(1)},
				{ "Fritz", 2},
				{ "Karl", 3},
				{ "Georg",4},
				{ "Franz", 5},
			},
			new String[] {
				"Name", "Bewertung"
			}
		) {
			/**
			 * 
			 */
			private static final long serialVersionUID = 1L;
			Class[] columnTypes = new Class[] {
				Object.class, String.class
			};
			public Class getColumnClass(int columnIndex) {
				return columnTypes[columnIndex];
			}
			private void writeObject(ObjectOutputStream out) throws IOException
			{
				out.writeObject(this.columnIdentifiers);
				out.writeObject(columnTypes);
				out.writeObject(this.dataVector);
			}
			
			private void readObject(ObjectInputStream in) throws IOException
			{
				try{
					Object o=in.readObject();
					if(o instanceof Vector)
					{
						this.columnIdentifiers=(Vector)o;
					}
					o=in.readObject();
					if(o instanceof Class[])
					{
						this.columnTypes=(Class[])o;
					}
					o=in.readObject();
					if(o instanceof Vector)
					{
						this.dataVector=(Vector)o;
					}
				}catch(ClassNotFoundException e)
				{
					e.printStackTrace();
				}

			}
		});
 
Zuletzt bearbeitet:

wottpal

Mitglied
Okay, danke erstmal, aber es funktioniert immer noch nur 1x :(
Aber jetzt gibt es eine andere Exception:
Java:
java.io.NotSerializableException: com.sun.java.swing.plaf.windows.XPStyle$Skin

Außerdem gab es bei:
Java:
 public Class getColumnClass(int columnIndex) {
                return columnTypes[columnIndex];
            }
immer eine NullpointerException, ohne liefs.

Und wie bekomme ich da jetzt noch Spaltenbreite hinein?

Schönen Sonntag, wottpal.
 

bERt0r

Top Contributor
In der Hoffnung dass du dir vielleicht doch meine Posts auch durchliest, nochmal eine komplette ausführbare Klasse. Ansonsten, wer code postet, dem kann geholfen werden, wer nicht dem nicht.

Java:
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.EventQueue;
import java.io.File;
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.util.Vector;

import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import javax.swing.JTable;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;


public class Serialize2 extends JFrame {

	private JPanel contentPane;
	private JTable table;
	private File tempFile;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					Serialize2 frame = new Serialize2();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public Serialize2() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 450, 300);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		contentPane.setLayout(new BorderLayout(0, 0));
		setContentPane(contentPane);
		
		table = new JTable();
		table.setModel(new DefaultTableModel(
	            new Object[][] {
	                {"Sepp",new Integer(1)},
	                { "Fritz", 2},
	                { "Karl", 3},
	                { "Georg",4},
	                { "Franz", 5},
	            },
	            new String[] {
	                "Name", "Bewertung"
	            }
	        ) {
	            /**
	             * 
	             */
	            private static final long serialVersionUID = 1L;
	            Class[] columnTypes = new Class[] {
	                Object.class, String.class
	            };
	            public Class getColumnClass(int columnIndex) {
	                return columnTypes[columnIndex];
	            }
	            private void writeObject(ObjectOutputStream out) throws IOException
	            {
	                out.writeObject(this.columnIdentifiers);
	                out.writeObject(columnTypes);
	                out.writeObject(this.dataVector);
	            }
	            
	            private void readObject(ObjectInputStream in) throws IOException
	            {
	                try{
	                    Object o=in.readObject();
	                    if(o instanceof Vector)
	                    {
	                        this.columnIdentifiers=(Vector<?>)o;
	                    }
	                    o=in.readObject();
	                    if(o instanceof Class[])
	                    {
	                        this.columnTypes=(Class[])o;
	                    }
	                    o=in.readObject();
	                    if(o instanceof Vector)
	                    {
	                        this.dataVector=(Vector<?>)o;
	                    }
	                }catch(ClassNotFoundException e)
	                {
	                    e.printStackTrace();
	                }
	 
	            }
	        });
		contentPane.add(table, BorderLayout.CENTER);
		
		JPanel panel = new JPanel();
		contentPane.add(panel, BorderLayout.SOUTH);
		
		JButton btnSerialize = new JButton("Serialize");
		btnSerialize.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) 
			{
				try {
					tempFile=File.createTempFile("Table", "tmp");
					ObjectOutputStream o=new ObjectOutputStream(new FileOutputStream(tempFile));
					table.removeEditor();
					o.writeObject(table.getModel());
					o.close();
				} catch (FileNotFoundException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		});
		panel.add(btnSerialize);
		
		JButton btnDeserialize = new JButton("Deserialize");
		btnDeserialize.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) 
			{
				if(tempFile==null)
				{
					JOptionPane.showMessageDialog((Component) e.getSource(), "Fehler","Erst serialisieren!",JOptionPane.ERROR_MESSAGE);
				}
				else
				{
				try {
					ObjectInputStream in=new ObjectInputStream(new FileInputStream(tempFile));
					TableModel tm=(TableModel)in.readObject();
					table.setModel(tm);
					table.revalidate();
				} catch (FileNotFoundException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				} catch (IOException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				} catch (ClassNotFoundException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
				}
			}
		});
		panel.add(btnDeserialize);
	}

}
 
Zuletzt bearbeitet:

wottpal

Mitglied
Krass, vielen dank dafür aber mein Problem bleibt bestehen, write- und read- Methoden überschrieben, klappt trotzdem nicht.

Angehängt ist mal die .jar damit du dich selbst davon überzeugen kannst, dass mehr als 1x speichern nicht drin ist und die .java, also die mit dem "Hauptquelltext", ist ein Netbeans-Projekt. Wenn du noch irgendwas brauchst sags einfach.

wottpal
 

Anhänge

  • Turing Machine.zip
    142 KB · Aufrufe: 1
  • TuringMachineView.java
    31,4 KB · Aufrufe: 10

bERt0r

Top Contributor
Versuch mal:
Java:
 public void beansprucheTabellen() {
        jTable1.removeEditor();
        jTable1.removeEditor();         //jTable2.removeEditor();
    }
Ausserdem: "turt" dein Programm noch weiter wenn du Serialisierst? Wenn du am Model herumwerkst während du serialisierst könnte das dein Problem erklären.
 
Zuletzt bearbeitet:

wottpal

Mitglied
Versuch mal:
Java:
 public void beansprucheTabellen() {
        jTable1.removeEditor();
        jTable1.removeEditor();         //jTable2.removeEditor();
    }
Ausserdem: "turt" dein Programm noch weiter wenn du Serialisierst? Wenn du am Model herumwerkst während du serialisierst könnte das dein Problem erklären.
Schreibfehler -.- aber die Korrektur bringt trotzdem noch den selben Fehler hervor..
Also ich fummele während dessen eigentlich nicht am Model herum, mich verwundert ja so stark, dass einmal speichern-laden funktioniert, nur beim 2. mal nicht.

Grüße
 
P

Pauler

Gast
Hallo,

ich habe genau das gleiche Problem.

Ich versuche meine TableModel zu serialisieren.

Es funktioniert beim ersten mal einwandfrei, aber immer wenn man es ein 2. mal versucht gibt es eine Exception:
java.io.NotSerializableException: com.sun.java.swing.plaf.windows.XPStyle$Skin
.
.
.
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException


Ich verstehe nicht warum es beim ersten mal immer funktioniert...aber egal was man danach macht (etwas ändern...nichts ändern...ne Stunde warten...) funktioniert es beim 2. Versuch nicht.
Jedesmal nach dem speichern das Programm neustarten ist für mich keine akzeptable Lösung...

Ich würde mich sehr freuen wenn mir jemand das Problem dabei erklären könnte.
 
S

SlaterB

Gast
ist das erste Speichern zufällig ganz am Anfang, noch bevor die GUI sichtbar ist?
dann wäre ja verständlich dass manche Komponenten wir irgendein Style noch nicht gesetzt sind
 
P

Pauler

Gast
Nein, die GUI wird angezeigt...dann mache ich irgendwas (trage ein paar Felder ein, lass ein wenig in anderen Teilen des Programms arbeiten...oder auch nicht...und dann speicher ich) und es funktioniert. Nur aber eben allein beim 1. mal. Egal was ich alles in der GUI rumklicke...schiebe, veränder oder sonstwas.

Ich habe herausgefunden das der beim schreiben des Objekts beim ersten mal die "com.sun.java.swing.plaf.windows.XPStyle$Skin" garnicht schreibt...
Das diese als zugehörig angesehen wird, scheint mit dem ersten schreiben des TableModel zusammenzuhängen.

Es hängt aber mit dem LookAndFeel zusammen, denn mit Nimbus LAF funktioniert das speichern ohne Probleme.
 
P

Pauler

Gast
Leider nicht.
Ich habe deine Lösungsvorschläge bereits versucht...angefangen vom überschreiben von writeObject() bis hin zu jTable.removeEditor()

möglicherweise habe ich etwas bei deinen Lösungsvorschlägen übersehen (was ich ja nicht komplett ausschließen würde), aber ansonsten besteht das Problem leider immernoch:(
 

bERt0r

Top Contributor
In dem Fall, Bedienungsanleitung fürs Forum:
1. Problem beschreiben. Konkret, exakt, am besten den gesamten StackTrace deiner Exception.
2. KSKB posten: Kurzes Beispiel, das dein Fehlerverhalten reproduziert. Wenn ich dein KSKB in ein leeres File kopiere, sollte es nachher lauffähig sein.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
D Problem mit der Serialisierung Java Basics - Anfänger-Themen 31
W Problem mit Serialisierung und TableModel Java Basics - Anfänger-Themen 3
DStrohma Problem mit Serialisierung Java Basics - Anfänger-Themen 3
K Verständnis Problem bei Server/Client Java Basics - Anfänger-Themen 2
I WildFily - unterschiedliche Libs im Projekt verursachen Problem Java Basics - Anfänger-Themen 11
imocode Vererbung Problem mit Vererbung Java Basics - Anfänger-Themen 2
L Taschenrechner Problem Java Basics - Anfänger-Themen 4
I Applikationsserver (WildFly) - Zugriff auf Ressourcen.. Problem mit Pfade Java Basics - Anfänger-Themen 10
A ScheduledExecutorService problem Java Basics - Anfänger-Themen 7
marcelnedza Problem mit Weltzuweisung, JavaKarol Java Basics - Anfänger-Themen 13
XWing Methoden rückgabe Problem? Java Basics - Anfänger-Themen 6
M Erste Schritte Collatz Problem max int Java Basics - Anfänger-Themen 3
M Problem bei verschachtelter for-Schleife bei zweidimensionalen Arrays Java Basics - Anfänger-Themen 3
C GLOOP Problem beim Erstellen der Kamera Java Basics - Anfänger-Themen 9
nelsonmandela Problem bei Ausgabe einer Switch - Case Funktion Java Basics - Anfänger-Themen 5
frager2345 Problem mit Methode Java Basics - Anfänger-Themen 4
L Problem bei Rechnung mit Math.pow Java Basics - Anfänger-Themen 13
A Thread-Schreibe-Lese-Problem Java Basics - Anfänger-Themen 4
SUPERTJB return Problem Java Basics - Anfänger-Themen 3
sserio BigInteger Problem Java Basics - Anfänger-Themen 4
JordenJost Taschenrechner problem Java Basics - Anfänger-Themen 5
K Problem mit "Random" Java Basics - Anfänger-Themen 5
S Datei anlegen Problem! Groß- und Kleinschreibung wird nicht unterschieden Java Basics - Anfänger-Themen 4
sserio Problem beim Anzeigen Java Basics - Anfänger-Themen 5
xanxk Problem For-Schleife mit Charakter Java Basics - Anfänger-Themen 2
L Unbekanntes Problem mit 2d Array Java Basics - Anfänger-Themen 6
sserio Liste erstellt und ein Problem mit dem Index Java Basics - Anfänger-Themen 8
sserio Schwimmen als Spiel. Problem mit to String/ generate a card Java Basics - Anfänger-Themen 4
J Schleife Problem Java Basics - Anfänger-Themen 2
D Problem mit der Erkennung von \n Java Basics - Anfänger-Themen 2
milan123 das ist meine aufgabe ich hab das problem das bei mir Wenn ich die Richtung der Linien verändern will und drei davon sind richtig, verändere ich die 4 Java Basics - Anfänger-Themen 3
M Verständins Problem bei Aufgabe Java Basics - Anfänger-Themen 4
HeiTim Problem mit der Kommasetzung an der richtigen stelle Java Basics - Anfänger-Themen 59
Temsky34 Problem mit dem Code Java Basics - Anfänger-Themen 17
P Problem mit Calendar.getDisplayName() Java Basics - Anfänger-Themen 8
C Problem mit mehreren Methoden + Scanner Java Basics - Anfänger-Themen 5
P Datei einlesen, nach Begriff filtern und in Datei ausgeben. Problem Standardausgabe über Konsole Java Basics - Anfänger-Themen 19
M Problem mit Klassenverständnis und Button Java Basics - Anfänger-Themen 8
EchtKeineAhnungManchmal hallo habe ein Problem mit einer Datei -> (Zugriff verweigert) Java Basics - Anfänger-Themen 4
H Problem mit Verzweigungen Java Basics - Anfänger-Themen 6
H Problem mit Rückgabewert Java Basics - Anfänger-Themen 7
josfe1234 JAVA FX problem Java Basics - Anfänger-Themen 3
A Code Problem Java Basics - Anfänger-Themen 6
Henri Problem von Typen Java Basics - Anfänger-Themen 7
J Problem mit "ArrayIndexOutOfBoundsException" Java Basics - Anfänger-Themen 11
K jackson Mapping - Problem mit Zeitzonen Java Basics - Anfänger-Themen 10
B Threads Problem mit mehreren Threads Java Basics - Anfänger-Themen 38
I Output BigDecimal anstatt double / Problem beim Rechnen Java Basics - Anfänger-Themen 16
D Schleifen Problem Java Basics - Anfänger-Themen 2
H So viele Fehlermeldungen, dass ich nicht weiß wo das Problem ist. Java Basics - Anfänger-Themen 6
J JAVA-Problem blockiert MEDIATHEKVIEW Java Basics - Anfänger-Themen 13
T Problem mit Lehrzeichen und String bei einfacher Chiffre Java Basics - Anfänger-Themen 8
J extends Problem Java Basics - Anfänger-Themen 2
C Polymorphie-Problem Java Basics - Anfänger-Themen 3
Kalibru Problem bei Ausgabe von Objekt Java Basics - Anfänger-Themen 1
I Format Problem mit Wert - bekomme 0,10 anstatt 10,00 Java Basics - Anfänger-Themen 6
J Problem mit einer Methode die gewissen Inhalt einer Array löschen soll Java Basics - Anfänger-Themen 9
J Problem mit einer Methode, die beliebig viele Objekte in Array speichern soll Java Basics - Anfänger-Themen 6
J Allgemeines Problem mit Klassen Java Basics - Anfänger-Themen 5
U Problem mit dem initialisieren meines Strings in einer Schleife Java Basics - Anfänger-Themen 5
amgadalghabra algorithmisches Problem Java Basics - Anfänger-Themen 19
J Traveling Salesman Problem [Arrays] Java Basics - Anfänger-Themen 9
R ArrayList Problem Java Basics - Anfänger-Themen 6
InfinityDE Problem mit Datenübergabe an Konstruktor Java Basics - Anfänger-Themen 7
C RegEx Problem Java Basics - Anfänger-Themen 4
J Anfänger TicTacToe, Problem bei Gewinnoption, sowohl Unentschieden Java Basics - Anfänger-Themen 8
E Taschenrechner GUI Problem mit Fehlerhandling Java Basics - Anfänger-Themen 6
M Input/Output Fallunterscheidung Problem Java Basics - Anfänger-Themen 17
P Problem beim Überschreiben einer vererbten Methode Java Basics - Anfänger-Themen 4
M Problem bei Ausgabe Java Basics - Anfänger-Themen 7
Splayfer Java Array Problem... Java Basics - Anfänger-Themen 2
G Problem bei der Ausgabe einer Main Claase Java Basics - Anfänger-Themen 7
F Problem mit KeyListener in kombination mit dem ActionListener Java Basics - Anfänger-Themen 4
G Subset sum problem mit Backtracking Java Basics - Anfänger-Themen 18
N Problem mit Scanner Java Basics - Anfänger-Themen 2
J Klassen Problem Java Basics - Anfänger-Themen 8
A Out.format problem. Java Basics - Anfänger-Themen 3
J Problem bei der Programmierung eines Tannenbaums Java Basics - Anfänger-Themen 9
A Array problem Java Basics - Anfänger-Themen 16
2 Taschenrechner mit GUI Problem bei der Berechnung Java Basics - Anfänger-Themen 8
W Remote Method Invocation RMI - Problem Java Basics - Anfänger-Themen 0
I Ich habe ein Problem Java Basics - Anfänger-Themen 3
A Problem bei returnen eines Wertes Java Basics - Anfänger-Themen 6
M Regex Erstellung Problem Java Basics - Anfänger-Themen 2
D Input/Output Problem bei der Benutzereingabe eines Befehls Java Basics - Anfänger-Themen 14
M (Sehr großes Problem) Listen als static in anderen Klassen verwendet Java Basics - Anfänger-Themen 12
F Habe ein problem mit dem ActionListener Java Basics - Anfänger-Themen 3
C Regex-Problem Java Basics - Anfänger-Themen 4
J Problem beim vergleich von zwei Integer Java Basics - Anfänger-Themen 3
M Problem in der Modellierung Java Basics - Anfänger-Themen 20
W Wo ist das URL-Problem ? Java Basics - Anfänger-Themen 1
S Generics-Problem: Class, Class<?>, Class<Object> Java Basics - Anfänger-Themen 4
D FileWriter / FileReader Problem Java Basics - Anfänger-Themen 10
G Problem beim Speichern von Objekten in einer Datei Java Basics - Anfänger-Themen 7
S Compiler-Fehler Exception in thread "main" java.lang.Error: Unresolved compilation problem: Java Basics - Anfänger-Themen 6
J Problem mit Array: 2 Klassen Java Basics - Anfänger-Themen 2
S Collections funktionale Listen (ListNode<E>) review und problem beim clone Java Basics - Anfänger-Themen 0
W OOP Vererbung und Problem bei Zählschleife in einer Methode Java Basics - Anfänger-Themen 10
C Problem mit If Else If und Überprüfung eines Counters Java Basics - Anfänger-Themen 3
F Problem mit Listen Java Basics - Anfänger-Themen 5

Ähnliche Java Themen


Oben