G
Guest
Gast
Hallo,
habe folgendes Problem. Wenn ich in meinem Zeichentool die Objekte verschiebe, wird gleich der aktuelle Stand(Position) aller Objekte in einem Vector abgespeichert.
Sobald eine Änderung der Objekte stattfindet, wird es sofort in die XML-Datei geschrieben. Bei Bedarf werden die Objekte auch aus der XML-Datei gelesen.
Meine Undo-Methode :
Das Problem ist, dass das undo/redo erst dann richtig funktioniert, wenn ich zuvor die objekte ändere und gleich danach undo/redo benutze, aber bei nachträglichen Änderungen kommt undo/redo nicht mehr ganz klar.
Das komische ist, wenn ich ganz am Anfang 10 objekte ändere und dann undo/redo willkürlich aufrufe, funktioniert es einwandfrei. Die Undo/Redo Methoden haben auch keinen Einfluss auf den Vector, wodrin die Vectoränderungen abgespeichert werden. Sie werden ja nur aufgerufen und angezeigt.
Wenn ich zB. ein einziges Objekt verschiebe, dann erst undo und dann redo aufrufe, und gleich danach eine andere Änderung vornehme, wird bei der ersten undo keine Änderung angezeigt, beim zweiten undo dafür dann beide. Bei Redo bei der ersten Betätigung werden beide Änderung angezeigt und beim zweiten dafür keine.
Was kann die Ursache sein ?
habe folgendes Problem. Wenn ich in meinem Zeichentool die Objekte verschiebe, wird gleich der aktuelle Stand(Position) aller Objekte in einem Vector abgespeichert.
Code:
public static Vector<PolyHistory> polyHistoryState = new Vector<PolyHistory>();
void fuegeActioninHistoryEin(Vector<MeinPolygon> vector) {
polyHistoryState.addElement(new PolyHistory(vector));
HauptFenster.activateUndoButton = true;
HauptFenster.undoButton.setIcon(new ImageIcon("IconPic/zurueckA.gif"));
}
fuegeActioninHistoryEin((Vector<MeinPolygon>) polyXML.getMarks().clone());
Sobald eine Änderung der Objekte stattfindet, wird es sofort in die XML-Datei geschrieben. Bei Bedarf werden die Objekte auch aus der XML-Datei gelesen.
Meine Undo-Methode :
Code:
int buttonClicks = 0;
int currentIndex = 0;
if (activateUndoButton) {
int i = PolygonMarkierung.polyHistoryState.size()-1;
buttonClicks++;
PolyHistory pH;
if ((i - buttonClicks) >= 0) {
pH = PolygonMarkierung.polyHistoryState.elementAt(i-buttonClicks);
zF.setShowRec(false);
zF.setShowNodes(false);
ZeichenFlaeche.showedPolyElements.clear(); ZeichenFlaeche.orgPolyElements.clear();
ZeichenFlaeche.showedPolyElements.addAll(pH.getVector());
ZeichenFlaeche.orgPolyElements.addAll(pH.getVector());
}
currentIndex = (i-buttonClicks);
if (currentIndex < i) {
activateRedoButton = true;
redoButton.setIcon(new ImageIcon("IconPic/vorA.gif"));
}
}
if (i - buttonClicks == 0) {
activateUndoButton = false;
undoButton.setIcon(new ImageIcon("IconPic/zurueckP.gif"));
}
}
if (activateRedoButton) {
int i = PolygonMarkierung.polyHistoryState.size()-1;
// hat hier keine an andere Funktion
buttonClicks--;
PolyHistory pH;
if (currentIndex < i) {
currentIndex++;
pH = PolygonMarkierung.polyHistoryState.elementAt(currentIndex);
zF.setShowRec(false);
zF.setShowNodes(false);
ZeichenFlaeche.showedPolyElements.clear();
ZeichenFlaeche.orgPolyElements.clear();
ZeichenFlaeche.showedPolyElements.addAll(pH.getVector());
ZeichenFlaeche.orgPolyElements.addAll(pH.getVector());
pH = null;
if (currentIndex > 0) {
activateUndoButton = true;
undoButton.setIcon(new ImageIcon("IconPic/zurueckA.gif"));
}
}
if (currentIndex == i) {
activateRedoButton = false;
redoButton.setIcon(new ImageIcon("IconPic/vorP.gif"));
}
}
Das Problem ist, dass das undo/redo erst dann richtig funktioniert, wenn ich zuvor die objekte ändere und gleich danach undo/redo benutze, aber bei nachträglichen Änderungen kommt undo/redo nicht mehr ganz klar.
Das komische ist, wenn ich ganz am Anfang 10 objekte ändere und dann undo/redo willkürlich aufrufe, funktioniert es einwandfrei. Die Undo/Redo Methoden haben auch keinen Einfluss auf den Vector, wodrin die Vectoränderungen abgespeichert werden. Sie werden ja nur aufgerufen und angezeigt.
Wenn ich zB. ein einziges Objekt verschiebe, dann erst undo und dann redo aufrufe, und gleich danach eine andere Änderung vornehme, wird bei der ersten undo keine Änderung angezeigt, beim zweiten undo dafür dann beide. Bei Redo bei der ersten Betätigung werden beide Änderung angezeigt und beim zweiten dafür keine.
Was kann die Ursache sein ?