2016-05-23 33 views
1

Ich versuche, eine Rückgängig-Methode für ein grundlegendes Malprogramm zu erstellen. Derzeit können Sie Größe und Farbe des Pinsels ändern und löschen. Ich versuche das vorherige Bild rückgängig zu machen, indem ich es als Bild (zuletzt) ​​speichere, und wenn das Rückgängigmachen aufgerufen wird, male ich das Bild. Ich habe ein paar Dinge ausprobiert, aber nichts hat funktioniert. Einfach das Bild "last" zu zeichnen, erzeugt einen identischen Effekt wie die Clear-Methode. Irgendwelche Ideen ?:Methode für ein Malprogramm rückgängig machen (Java)

import java.applet.*; 
import java.util.*; 
import java.awt.*; 
import java.lang.Object.*; 

public class Paint extends Applet 
{ 
private int x; 
private int y; 
private int size = 10; 
private int sides = 200; 
private int color = 0; 
private Rectangle red, orange, yellow, green, blue, purple, pink, black; 
private Rectangle triangle, square, pentagon, hexagon, octagon, circle; 
private Rectangle small, medium, large; 
private Rectangle eraser, clear, undo; 
private Rectangle menuBar; 
private Image last; 
private Graphics g2; 

//defines rectangles 
public void init() 
{ 
    setSize(400,600); 

    red = new Rectangle(0,0,25,25); 
    orange = new Rectangle(0,25,25,25); 
    yellow = new Rectangle(0,50,25,25); 
    green = new Rectangle(0,75,25,25); 
    blue = new Rectangle(0,100,25,25); 
    purple = new Rectangle(0,125,25,25); 
    pink = new Rectangle(0,150,25,25); 
    black = new Rectangle(0,175,25,25); 

    triangle = new Rectangle(0,200,25,25); 
    square = new Rectangle(0,225,25,25); 
    pentagon = new Rectangle(0,250,25,25); 
    hexagon = new Rectangle(0,275,25,25); 
    octagon = new Rectangle(0,300,25,25); 
    circle = new Rectangle(0,325,25,25); 

    small = new Rectangle(0,355,25,25); 
    medium = new Rectangle(0,370,50,50); 
    large = new Rectangle(0,420,100,100); 

    eraser = new Rectangle(0,520,50,25); 
    clear = new Rectangle(0,545,60,30); 
    undo = new Rectangle(0,575,60,30); 

    menuBar = new Rectangle(0,0,70,650); 
} 

//paints the blocks of color in the menu bar 
public void paintColors(Graphics g) 
{ 
    g.setColor(Color.red); 
    g.fillRect(0,0,25,25); 
    g.setColor(Color.orange); 
    g.fillRect(0,25,25,25); 
    g.setColor(Color.yellow); 
    g.fillRect(0,50,25,25); 
    g.setColor(Color.green); 
    g.fillRect(0,75,25,25); 
    g.setColor(Color.blue); 
    g.fillRect(0,100,25,25); 
    g.setColor(new Color(160,32,240)); 
    g.fillRect(0,125,25,25); 
    g.setColor(Color.pink); 
    g.fillRect(0,150,25,25); 
    g.setColor(Color.black); 
    g.fillRect(0,175,25,25); 
} 

//paints the shapes, eraser, clear, and undo in the menu bar 
public void paintShapes(Graphics g) 
{ 
    g.setColor(Color.black); 
    Utility.fillTri(g,12,212,25); 
    g.fillRect(2,227,20,20); 
    Utility.fillPent(g,12,262,25); 
    Utility.fillHex(g,12,287,25); 
    Utility.fillOct(g,12,312,25); 
    Utility.fillPoly(g,12,337,25,300); 

    g.fillOval(2,355,10,10); 
    g.fillOval(2,370,50,50); 
    g.fillOval(2,420,100,100); 

    g.setColor(Color.black); 
    g.drawRect(1,521,52,26); 
    g.setColor(Color.pink); 
    g.fillRect(2,522,40,25); 

    g.setColor(Color.black); 
    g.setFont(new Font("Arial",Font.PLAIN,20)); 
    g.drawString("CLEAR",2,580); 
    g.drawString("UNDO",2,610); 
} 

public void paint(Graphics g) 
{ 
    g2 = getGraphics(); 

    g2.setColor(Color.white); 
    g2.fillRect(0,0,60,getHeight()); 
    paintColors(g2); 
    paintShapes(g2); 

    draw(g2); 
} 

public void draw(Graphics g) 
{ 
    getColor(g); 

    Utility.fillPoly(g,x,y,size,sides); //fills a regular polygon with specified center, size, and number of sides 
} 

public boolean mouseDown(Event e, int xx, int yy) 
{ 
    x = xx; 
    y = yy; 

    if(red.inside(xx,yy)) 
    color = 0; 
    else if(orange.inside(xx,yy)) 
    color = 1; 
    else if(yellow.inside(xx,yy)) 
    color = 2; 
    else if(green.inside(xx,yy)) 
    color = 3; 
    else if(blue.inside(xx,yy)) 
    color = 4; 
    else if(purple.inside(xx,yy)) 
    color = 5; 
    else if(pink.inside(xx,yy)) 
    color = 6; 
    else if(black.inside(xx,yy)) 
    color = 7; 

    if(triangle.inside(xx,yy)) 
    sides = 3; 
    else if(square.inside(xx,yy)) 
    sides = 4; 
    else if(pentagon.inside(xx,yy)) 
    sides = 5; 
    else if(hexagon.inside(xx,yy)) 
    sides = 6; 
    else if(octagon.inside(xx,yy)) 
    sides = 7; 
    else if(circle.inside(xx,yy)) 
    sides = 200; 

    if(small.inside(xx,yy)) 
    size = 10; 
    else if(medium.inside(xx,yy)) 
    size = 50; 
    else if(large.inside(xx,yy)) 
    size = 100; 

    if(eraser.inside(xx,yy)) 
    color = 8; 

    if(clear.inside(xx,yy)) 
    clear(g2); 
    else if(undo.inside(xx,yy)) 
    undo(g2); 

    if(!menuBar.inside(xx,yy)) 
    last = createImage(getWidth(),getHeight()); 

    return true; 
} 

public boolean mouseDrag(Event e, int xx, int yy) 
{ 
    x = xx; 
    y = yy; 
    if(!menuBar.inside(xx,yy)) 
    repaint(); 

    return true; 
} 

public void update(Graphics g) 
{ 
    paint(g); 
} 

public void clear(Graphics g) 
{ 
    color = 8; 
    getColor(g); 
    g.fillRect(0,0,getWidth(),getHeight()); 
    color = 0; 
    repaint(); 
} 

public void undo(Graphics g) 
{ 

{ 

public int getColor(Graphics g) 
{ 
    switch(color){ 
    case 0: g.setColor(Color.red); 
    break; 
    case 1: g.setColor(Color.orange); 
    break; 
    case 2: g.setColor(Color.yellow); 
    break; 
    case 3: g.setColor(Color.green); 
    break; 
    case 4: g.setColor(Color.blue); 
    break; 
    case 5: g.setColor(new Color(160,32,240)); 
    break; 
    case 6: g.setColor(Color.pink); 
    break; 
    case 7: g.setColor(Color.black); 
    break; 
    case 8: g.setColor(new Color(238,238,238)); 
    break; 
    } 

    return color; 
} 
} 
+1

Seitennotiz auf Code-Qualität: Ihre lange lange if/else Staaten ... einfach schrecklichen Code. Werden Sie es los oder die Wartung wird schnell zu Albträumen für Sie. Für die eigentliche Frage: Vielleicht möchten Sie das * Befehl * Muster studieren. Anstatt ganze Bilder zu speichern (was wie eine sehr ressourcenintensive Idee klingt), sollten Sie sicherstellen, dass jede "Änderung" zu einem Gemälde ... eigentlich eine Art Befehlsobjekt ist; das erinnert sich: Sie haben einen Kreis gezeichnet, x, y, Radius, Farbe. Sie behalten alle "angewandten" Befehle in einer Warteschlange; und "rückgängig machen" bedeutet, den letzten Eintrag fallen zu lassen. – GhostCat

+0

nein es doenst arbeiten und du musst alles mit einschließen – gpasch

+0

gpasch, es funktioniert. Ich führe es jetzt auf meinem Computer. Es kompiliert und läuft, aber die Undo-Methode hat einen logischen Fehler. – MJ31

Antwort

0

Sie fügen der Undo-Liste auf jedem mousedown hinzu, selbst wenn der mousedown das Bild nicht ändert.

Wenn Sie also auf die Option Rückgängig klicken, speichern Sie zuerst das Bild und stellen dann dasselbe Bild wieder her.

Sie sollten nur in der Undo-Liste speichern, bevor das Bild tatsächlich vom Benutzer geändert wird.

+0

Ok, danke. Das hilft. Die Undo-Methode löscht derzeit jedoch nur den Bildschirm vollständig. – MJ31

1

Ich empfehle dringend, einige Variante Command Muster zu verwenden, Geschichte zu behandeln.

Swing hat einen einfachen Verlaufsmanager namens UndoManager. Im Allgemeinen wird es mit Texteditoren verwendet, aber es funktioniert auch mit benutzerdefinierten Befehlen.

Wenn Sie Swing nicht verwenden möchten oder UndoManager nicht Ihren Anforderungen entspricht, versuchen Sie es mit einer alternativen Standalone-Lösung oder implementieren Sie Ihre eigenen. I also implemented my own für eine große Cross-Plattform-Anwendung.

Sie sollten also alle Ihre Bearbeitungsmethoden in Befehlsklassen einschließen, die eine gemeinsame Schnittstelle implementieren (z. B. Command oder UndoableEdit) und Methoden für "do" und "undo" haben.

Es ist schwieriger, Befehle für Grafiken als für Textdokumente zu implementieren, in denen Sie nur minimale Informationen über die Bearbeitung speichern müssen. Speichern Sie das Rechteck des geänderten Bereichs aus dem Originalbild auf "Ausführen" und stellen Sie es auf "Rückgängig" wieder her.