gezeichnete Graphiken speichern und wieder anzeigen

noch_anfänger

Aktives Mitglied
Hallo,

ist es möglich, auf dem JPanel gezeichnete Graphiken zu speichern und später noch Mal (mehrere Mals) zu zeigen?
Es sollte so sein:

ich wähle im JSpinner einen Wert und zeichne dazu einige Zechnungen auf dem JPanel. Es geht nur um einfaches Zeichnen, nicht um Rotieren oder so. Wenn ich einen neuen Wert im JSpinner wähle, muss die vorherige Graphik gespeichert werden. Zu dem neu gewählten Wert zeichne ich etwas neues. Wenn ich aber den vorherigen Wert im Spinner wähle, und dazu etwas schon gezeichnet wurde, muss die entsprechende (vorherige) Graphik angezeigt werden. JSpinner hat 45 Werte, zu jedem sollte man die Zeichnungen speichern können. Ist das möglich?
Man kann alles Vorhergezeichnetes (alle gespeicherte Zeichnungen) mit einem Knopfdruck löschen.

Kann man vielleicht das ganze aktuelle JPanel mit allen gezeichneten Objekten speichern und beim Bedarf anzeigen?
 
du wirst ja die Objekte die du zeichnest in irgendeiner Collection haben und diese Collection im JPanel in der paintComponent Methode darstellen.
Du musst dir eigentlich nur die Collection in einer Map zu deinem Wert speichern, und wenn dieser Wert im Spinner ausgewählt wird holst du dir über den Key die Collection, übergibst die Collection an den JPanel und dieser macht dann einfach ein repaint
 
Deine Zeichnungen sei es Linie, Kreis oder sonstiges sind ja irgendwelche Objekte zum Beispiel die Oberklasse könnte Figur sein. Du könntest eine Neue Klasse einführen die Komposition heisst und auch von der Klasse Figur erbt. Hast du eine Zeichnung fertiggezeichnet, ist es aufjeden Fall eine Figur. Jetzt Könntest du in einer HashTabelle diese Zeichnung bzw. Komposition ablegen.
Key: Einstellungswert im JSpinner
Value: Komposition

so ungefähr würde ich das versuchen.

gruss
 
Statt mit einer HashMap zu arbeiten könnte man auch gleich die Objekte mit XMLEncoder in eine Datei schreiben, wobei der Dateiname die Zahl vom JSpinner enthält. Das Laden geht dann mit XMLDecoder und ist auch noch möglich nach einem Programmneustart .
 
Zuletzt bearbeitet:
Nach dem Vorschalg von Niki habe ich so gemacht:

Java:
private ArrayList<Paintable> figures = new ArrayList<Paintable>();
private HashMap<Integer, ArrayList<Paintable>> pictures = new HashMap<Integer, ArrayList<Paintable>>();
Code:
Paintable
ist dabei ein interface.

Ich füge Elemente zu HashMap in zwei Schritten hinzu:
Java:
Rhomb rhomb = new Rhomb(ein Paintabel);
...
figures.add(rhomb);
pictures.put(spinWert, figures);

Und das ist falsch. In
Code:
figures
werden Elemente immer wieder hinzugefügt und unabhängig vom Spinner-Wert, d.h. alles, was ich gezeichnet habe. Ich soll offensichtlich zu jedem Spinner-Wert ein
Code:
ArrayList<Paintable>
haben. Da ich 45 Spinner-Werte habe, ist das blöd, 45 private Variablen zu definieren. Wie kann ich das anders machen?
 
Ist es denn wichtig, dass man weiss zu welchen Spinnerwert welche Zeichnungen/graphischen Objekte gehören? Oder kann man nicht einfach alle zu zeichnenden Objekte in eine gemeinsame Liste stecken?

Ansonsten eine Klasse erstellen die den jeweiligen Spinnerwert als eine Art ID enthält und die zu zeichnenden Objekte in einer Liste vorhält und per Methode diese auf ein Graphics Objekt zeichnet. Das zeichnende JPanel hält dann einfach nur eine Liste solcher Objekte und arbeitet diese ab.

Edit: Hab mir gerade noch mal den Post durch gelesen und jetzt erst richtig verstanden worum's geht - zumindest glaube ich das.
Also die ersten zwei Sätze vergessen. Eine eigene Klasse schreiben, die für einen bestimmten Wert die Zeichnungen verwalten - nehme mal an, dass man da auch nachträglich Objekte hinzufügen soll.
Wie bereits oben geschrieben verwaltet das zeichnende JPanel eine Liste mit Objekten dieser Klasse und zeichnet entsprechen des aktuellen Spinnerwerts bzw. erstellt ein neues Objekt, wenn zu dem Wert noch kein "Verwaltungs"Objekt existiert.
 
Vielen Dank!

Die Sache ist schon erledigt.
Ich habe ähnlich zu
Eine eigene Klasse schreiben, die für einen bestimmten Wert die Zeichnungen verwalten - nehme mal an, dass man da auch nachträglich Objekte hinzufügen soll. Wie bereits oben geschrieben verwaltet das zeichnende JPanel eine Liste mit Objekten dieser Klasse und zeichnet entsprechen des aktuellen Spinnerwerts bzw. erstellt ein neues Objekt, wenn zu dem Wert noch kein "Verwaltungs"Objekt existiert.

gemacht. Aber nicht eine Klasse, sondern ein
Code:
ArrayList<ArrayList<Paintable>>
.
 

Zurück
Oben