Wie man sinnvoll UndoableEditSupport.beginUpdate() und endUpdate() nutzt API-Erklärung durch ein Beispiel. Die Grundlage für das Beispiel stammt von John Zukowski: UndoDrawing.htm
Damit wir das Beispiel auch sichtbar am Bildschirm verfolgen können,
machen wir uns erstmal eine Klasse "UndoableDrawingPanel".
Dort wird mit jedem Mausklick ein Punkt zu einem Polygon hinzugefügt und repaint() aufgerufen.
Das Polygon wird dann in paintComponent auf dem Panel dargestellt.
Gleichzeitig wird mit postEdit(..) ein UndoableEdit zum UndoableEditSupport geschickt.
"beginUpdate" machen wir bei updateLevel 0 und "endUpdate" nach jedem zweiten Mausklick.
Der Effekt ist, daß bei "undo" jeweils zwei Mausklicks rückgängig gemacht und bei "redo"
zwei wiederhergestellt werden:
Code:
/*
* UndoableDrawingPanel.java
*/
package demo;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.undo.*;
class UndoableDrawingPanel extends JPanel {
private UndoableEditSupport undoableEditSupport = new UndoableEditSupport(this);
private Polygon polygon = new Polygon();
public UndoableDrawingPanel() {
MouseListener mouseListener = new MouseAdapter() {
@Override
public void mouseReleased(final MouseEvent mouseEvent) {
if (undoableEditSupport.getUpdateLevel() == 0) {
undoableEditSupport.beginUpdate();
}
undoableEditSupport.postEdit(new UndoableDrawEdit(UndoableDrawingPanel.this));
polygon.addPoint(mouseEvent.getX(), mouseEvent.getY());
repaint();
if (polygon.npoints % 2 == 0) {
undoableEditSupport.endUpdate();
}
}
};
addMouseListener(mouseListener);
}
public void addUndoableEditListener(final UndoableEditListener undoableEditListener) {
undoableEditSupport.addUndoableEditListener(undoableEditListener);
}
public void removeUndoableEditListener(final UndoableEditListener undoableEditListener) {
undoableEditSupport.removeUndoableEditListener(undoableEditListener);
}
public void setPolygon(final Polygon newValue) {
polygon = newValue;
repaint();
}
public Polygon getPolygon() {
Polygon returnValue;
if (polygon.npoints == 0) {
returnValue = new Polygon();
} else {
returnValue = new Polygon(polygon.xpoints, polygon.ypoints, polygon.npoints);
}
return returnValue;
}
@Override
protected void paintComponent(final Graphics g) {
super.paintComponent(g);
g.drawPolygon(polygon);
}
}
Der UndoableEdit wird in unserer Klasse "UndoableDrawEdit" implementiert:
Hmm...ich muss mir das mal Zeile fuer Zeile anschauen. Mit begin/end-update kann ich also ohne weiteren Aufwand sowas machen wie UndoableEvents zusammenfassen, bzw. das mehrere auf einmal rueckgaengig gemacht werden, richtig?
Ich muss nur noch herauskriegen wie dieser Vorgang genau funktioniert.
Mit begin/end-update kann ich also ohne weiteren Aufwand sowas machen wie UndoableEvents zusammenfassen, bzw. das mehrere auf einmal rueckgaengig gemacht werden, richtig?