java.io.NotSerializableException

Status
Niet open voor verdere reacties.

Tim Hovius

Gebruiker
Lid geworden
25 jan 2008
Berichten
788
Hallo allemaal,

Ik was bezig met een tekenapplicatie in Java die kan tekenen (een soort paint, maar heel primitief).

Het probleem is als ik de tekening wil opslaan, dat ik de volgende error krijg: java.io.NotSerializableException: tekening.Tekening

Wie weet een oplossing?

Mijn code:

Tekening.java
[CPP]package tekening;

import java.awt.*;
import java.util.*;

public class Tekening
{
ArrayList<Point> puntenLijst;
Point punt;
Color kleur;

/**
* Maak in de contructor een ArrayList met punten aan
*/

public Tekening(Color kleur)
{
puntenLijst = new ArrayList<Point>();
this.kleur = kleur;
}

/**
* Methode om een punt toe te voegen aan de ArrayList
*/

public void voegPuntToe(Point punt)
{
puntenLijst.add(punt);
}

/**
*
* @param richting
* : deze String kan de waarde LINKS, RECHTS, OMLAAG, OMHOOG
* krijgen. Vervolgens wordt met een if de punten aangepast in de
* ArrayList
*/

public void verplaatsTekening(String richting)
{
if (richting == "LINKS")
{
for (int i = 0; i < puntenLijst.size(); i++)
{
Point huidigPunt = puntenLijst.get(i);
int x = huidigPunt.x;
int y = huidigPunt.y;

huidigPunt.move(x - 1, y);

puntenLijst.set(i, huidigPunt);
}
}

if (richting == "RECHTS")
{
for (int i = 0; i < puntenLijst.size(); i++)
{
Point huidigPunt = puntenLijst.get(i);
int x = huidigPunt.x;
int y = huidigPunt.y;

huidigPunt.move(x + 1, y);

puntenLijst.set(i, huidigPunt);
}
}

if (richting == "OMHOOG")
{
for (int i = 0; i < puntenLijst.size(); i++)
{
Point huidigPunt = puntenLijst.get(i);
int x = huidigPunt.x;
int y = huidigPunt.y;

huidigPunt.move(x, y - 1);

puntenLijst.set(i, huidigPunt);
}
}

if (richting == "OMLAAG")
{
for (int i = 0; i < puntenLijst.size(); i++)
{
Point huidigPunt = puntenLijst.get(i);
int x = huidigPunt.x;
int y = huidigPunt.y;

huidigPunt.move(x, y + 1);

puntenLijst.set(i, huidigPunt);
}
}
}

/**
* Teken de huidige tekening
*/

public void teken(Graphics g)
{
g.setColor(kleur);

for (int i = 0; i < puntenLijst.size(); i++)
{
Point huidigPunt = puntenLijst.get(i);

g.fillOval(huidigPunt.x - 4, huidigPunt.y - 4, 8, 8);

if (i > 0)
{
Point vorigePunt = puntenLijst.get(i - 1);
g.drawLine(vorigePunt.x, vorigePunt.y, huidigPunt.x,
huidigPunt.y);
}
}
}
}
[/CPP]
TekeningApp.java
[CPP]package tekening;

import java.awt.event.*;
import java.io.*;

import javax.swing.*;

/**
*
* @author Tim
*
*/

public class TekeningApp extends JFrame implements ActionListener
{
private TekeningPaneel tekeningPaneel;
private JMenuBar menuBar;
private JMenu bestand;
private JMenuItem opslaan, laden;

public TekeningApp()
{
this.setSize(700, 700);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setTitle("Tekeningen");
this.setLocation(50, 50);

tekeningPaneel = new TekeningPaneel();
this.add(tekeningPaneel);

menuBar = new JMenuBar();
this.setJMenuBar(menuBar);

bestand = new JMenu("Bestand");
menuBar.add(bestand);

laden = new JMenuItem("Laden");
bestand.add(laden);
laden.addActionListener(this);
opslaan = new JMenuItem("Opslaan");
bestand.add(opslaan);
opslaan.addActionListener(this);

this.setVisible(true);
}

public static void main(String[] args)
{
new TekeningApp();
}

public void actionPerformed(ActionEvent e)
{
if (e.getSource() == opslaan)
{
try
{

FileOutputStream fos = new FileOutputStream("tekening.sav");
ObjectOutputStream oos = new ObjectOutputStream(fos);

oos.writeObject(tekeningPaneel);
oos.close();
}

catch (FileNotFoundException error)
{
System.out.println(error);
}

catch (IOException error)
{
System.out.println(error);
}

}

if (e.getSource() == laden)
{
try
{
FileInputStream fis = new FileInputStream("tekening.sav");
ObjectInputStream ois = new ObjectInputStream(fis);

this.remove(this.tekeningPaneel);

this.tekeningPaneel = (TekeningPaneel) ois.readObject();
this.add(this.tekeningPaneel);

this.repaint();

ois.close();
}

catch (ClassNotFoundException error)
{
System.out.println(error);
}

catch (IOException error)
{
System.out.println(error);
}
}
}
}[/CPP]
TekeningPaneel.java
[CPP]package tekening;

import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;

public class TekeningPaneel extends JPanel implements KeyListener,
MouseListener, MouseMotionListener
{
private Tekening tekening;
private Random getallengenerator;
private Color willekeurigeKleur;
private Color[] kleur;

private ArrayList<Tekening> tekeningLijst;

public TekeningPaneel()
{
/**
* Maak een array aan met kleuren en kies een random kleur om te
* beginnen met tekenen
*/

kleur = new Color[13];

kleur[0] = Color.black;
kleur[1] = Color.blue;
kleur[2] = Color.cyan;
kleur[3] = Color.darkGray;
kleur[4] = Color.gray;
kleur[5] = Color.green;
kleur[6] = Color.lightGray;
kleur[7] = Color.magenta;
kleur[8] = Color.orange;
kleur[9] = Color.pink;
kleur[10] = Color.red;
kleur[11] = Color.white;
kleur[12] = Color.yellow;

getallengenerator = new Random();
willekeurigeKleur = kleur[getallengenerator.nextInt(12)];

/**
* Maak een nieuwe ArrayList aan met tekeningen
*/

tekeningLijst = new ArrayList<Tekening>();

/**
* Maak een tekening aan om te starten
*/

tekening = new Tekening(willekeurigeKleur);
tekeningLijst.add(tekening);

this.addMouseListener(this);
this.addMouseMotionListener(this);
this.addKeyListener(this);
}

/**
* Tekenmethode om de tekeningen te tekenen
*/

public void paintComponent(Graphics g)
{
super.paintComponent(g);

for (int i = 0; i < tekeningLijst.size(); i++)
{
Tekening tekening = tekeningLijst.get(i);
tekening.teken(g);
}
}

public void mousePressed(MouseEvent e)
{
/**
* Geef het venster de focus zodat de tekening kan worden verschoven met
* de pijltjes toetsen
*/

this.requestFocus();

/**
* Voeg een punt toe als er op de linkermuis wordt gedrukt en maak een
* nieuwe tekening aan als er op de rechtermuis wordt gedrukt
*/

if (e.getButton() == 1)
{
tekening.voegPuntToe(e.getPoint());
}

if (e.getButton() == 3)
{
willekeurigeKleur = kleur[getallengenerator.nextInt(12)];
tekening = new Tekening(willekeurigeKleur);
tekeningLijst.add(tekening);
}

repaint();
}

public void mouseDragged(MouseEvent e)
{
if (e.isMetaDown() == true)
{

}

else
{
tekening.voegPuntToe(e.getPoint());
repaint();
}
}

/**
* Verplaats de tekening als er op de pijltjes toetsen wordt gedrukt
*/

public void keyPressed(KeyEvent e)
{
if (e.getKeyCode() == KeyEvent.VK_LEFT)
{
tekening.verplaatsTekening("LINKS");
}

if (e.getKeyCode() == KeyEvent.VK_RIGHT)
{
tekening.verplaatsTekening("RECHTS");
}

if (e.getKeyCode() == KeyEvent.VK_UP)
{
tekening.verplaatsTekening("OMHOOG");
}

if (e.getKeyCode() == KeyEvent.VK_DOWN)
{
tekening.verplaatsTekening("OMLAAG");
}

repaint();
}

public void keyReleased(KeyEvent e)
{

}

public void keyTyped(KeyEvent e)
{

}

public void mouseClicked(MouseEvent e)
{

}

public void mouseReleased(MouseEvent e)
{

}

public void mouseMoved(MouseEvent e)
{

}

public void mouseEntered(MouseEvent e)
{

}

public void mouseExited(MouseEvent e)
{

}

}
[/CPP]
 
Dankje, het werkt weer. Ik heb nu bij de klasse tekening dit gezet:

[CPP]public class Tekening implements Serializable[/CPP]
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan