Undo und Redo in Malprogramm

Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Ich möchte gern in meinen Malprogramm eine Funktion schreiben, mit der Zeichenoperationen rückgängig machen bzw. wiederherstellen kann, evtl. zusätzlich eine Annulierungsliste.
Der Nutzer hat für verschiedene Zeichenoperationen bestimmte Buttons - es wählt sich zuerst mal den Zeichenobjekt z.B. Ellipse, Rechteck, Oval, Line, usw. aus - die Bedienung / Oberfläche orientiert sich weitgehed an MsPaint -.
 
B

Beni

Gast
Vektorgraphik oder "normales" Bild?

Was hast du dir schon überlegt, wie hast du es aufgebaut, irgendwelche weiterführenden Informationen, und vorallem: was ist denn jetzt das Problem?
 

abollm

Top Contributor
Folgender Code stellt ein Simpel-Malprogramm dar, mit dem einfach Linien gezeichnet werden können (linke Maustaste gedrückt lassen und Linie zeichnen, danach Maustaste loslassen). Die einzelnen gezeichneten Linien können durch Ctrl-Z wieder rückgängig gemacht werden.

Code:
/*
 * Created on 01.10.2004
 *
 */

/**
 * @author 
 *
 * TODO
 */

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

public class PaintLine1 {
    static class Line {
        public Point from, to;

        Line(Point from, Point to) {
            this.from = from;
            this.to = to;
        }

        /*
        public String toString() {
            return from + "=>" + to;
        }
        */
    }

    static class DrawingPanel extends JPanel {
        private Stack lines = new Stack();

        public DrawingPanel() {
            addMouseListener(new MouseAdapter() {
                private Point from;

                public void mousePressed(MouseEvent e) {
                    from = new Point(e.getPoint().x, e.getPoint().y);
                }

                public void mouseReleased(MouseEvent e) {
                    addLine(new Line(from, new Point(e.getPoint().x, e
                            .getPoint().y)));
                }
            });
        }

        void addLine(Line line) {
            lines.add(line);
            repaint();
        }
        // Undo-Funktion
        void undo() {
            if (lines.size() > 0) {
                lines.pop();
                repaint();
            }
        }
        // hier folgt die Redo-Funktionalität
        void redo() {
            //if (lines.size() > 0) {
            //    lines.pop();
            //    repaint();
            //}
        }

       
        public void paint(Graphics g) {
            g.setColor(Color.white);
            g.fillRect(0, 0, getSize().width, getSize().height);
            g.setColor(Color.black);
            for (Iterator i = lines.iterator(); i.hasNext();) {
                Line line = (Line) i.next();
                g.drawLine(line.from.x, line.from.y, line.to.x, line.to.y);
            }
        }
    }

    public static void main(String[] argv) throws Exception {
        final DrawingPanel panel = new DrawingPanel();
        JFrame frame = new JFrame(PaintLine1.class.getName());
        frame.addKeyListener(new KeyAdapter() {
            public void keyReleased(KeyEvent e) {
                if ((e.getModifiersEx() | e.CTRL_DOWN_MASK) == e
                        .getModifiersEx()
                        && e.getKeyCode() == e.VK_Z) {
                    panel.undo();
                }
                if ((e.getModifiersEx() | e.CTRL_DOWN_MASK) == e
                        .getModifiersEx()
                        && e.getKeyCode() == e.VK_Y) {
                    panel.redo();
                }
            }
        });
        frame.getContentPane().add(panel, BorderLayout.CENTER);
        frame.pack();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setBounds(100, 100, 640, 480);
        frame.setVisible(true);
    }
}


Du hast jetzt die Aufgabe das Programm so zu erweitern, dass auch eine Redo-Funktionalität (Ctrl-Y) enthalten ist.

Viel Spaß beim Programmieren!
 

Illuvatar

Top Contributor
Was ich nuetzlich finde, ist eine abstrakte Superklasse UndoRedoAction (oder so aehnlich) mit deb Methoden undo() und redo() und fuer alles was du im Programm machen kannst, eine Konkretisierung davon. Die Superklasse kann ja auch gleichzeitig die factory-Klasse sein. Immer wenn der User macht, wird eine neue UndoRedoAction auf einen Stack gelegt. Wenn der User undo macht, wird die Undomethode der obersten Action ausgefuehrt und diese auf einen anderen Stack gelegt. Bei redo das entsprechende mit besagtem anderen Stack.

Nur als Tip :wink:
 
N

nemesis

Gast
Da gibts in Swing auch ne Klasse: javax.swing.undo.*;
Man weist einem Undomanager dabei der Komponete zu, mehr weiss ich auch net, aber hier im Forum hat's ein Tut. Einfach suchen...
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen


Oben