undo funktion in Malprogramm

Status
Nicht offen für weitere Antworten.

anfänger15

Bekanntes Mitglied
Hallo alle zusammen.

Ich bin gerade dabei mir ein Malprogramm zu programmieren. Ich zeichne in dem Programm zuerst alles in ein BufferedImage und dann das BufferedImage auf einen JPanel. Ich habe versucht mit einem Stack eine undo funktion einzubauen.

Meine Frage: Wie kann ich beim betätigen der undo funktion alles was in dem Stack geschpeichert ist in das BufferdImage malen?

Oder hat jemand eine bessere Idee für eine Rückgängig funktion in einem Malprogramm.

danke
 
S

SlaterB

Gast
das ist ja eine logische Frage und was soll man darauf antworten außer 'ja tue es, baue es so dass es funktioniert'?..

bevor du über Undo nachdenkst musst du natürlich allgemein wissen,
wie du ein Bild wieder ganz weiß kriegst und vorgespeicherte Operationen darauf ausführst,

was soll man da sagen?
 

schalentier

Gesperrter Benutzer
Also prinzipiell wuerde ich vektororientiert rangehen. Soll heissen, du speicherst keine BufferedImages sondern die Befehle, die der Benutzer durchgefuehrt hat.

Jedes repaint malt dann einfach immer die komplette Liste, quasi eine Art Makro. Vorteil: Du kannst mit der Liste alles moegliche anstellen, zb den letzten Befehl weglassen (=Undo). Oder alles abspeichern.

Wenn das klappt, kannste ueber Performancetuning nachdenken, zb alle paar Zeichenbefehle in der Liste, ein BufferedImage in der Liste ablegen. Repaint zeichnet dann dieses BufferedImage und arbeitet wie gewohnt den Rest ab.

Nur so als Anregungen ;-)
 
S

SlaterB

Gast
> Wie kann ich beim betätigen der undo funktion alles was in dem Stack geschpeichert ist in das BufferdImage malen

> Jedes repaint malt dann einfach immer die komplette Liste

ja, dieser geniale Tipp bringt einen weiter ;)

(sorry, aber wenn du schon so spitz drauf hinweist ;) )
 

anfänger15

Bekanntes Mitglied
Ich weiß es ist schon ein weilchen her, hab jetzt aber immer noch ein Problem.
Wenn ich etwas gemalt hab, dann geht die undo funktion, male ich jetzt aber nochmal was und will wieder die undo funktion benutzen geht es nicht mehr, weil sich undo vergrößert hat. Es wird also alles was ich vorher undo gemacht habe wieder gezeichnet.
Hier mal ein bisschen Code:
Code:
switch(modus) {
  	case 1:
  	Rcolor.addElement(getForeground());
                undo.addElement(new Rectangle(x, y, w, h));
                break;
}

die undo funktion:
Code:
	if(undo.size() > 0){
 	zurück++;
 	 	}

for (int i =0; undo.size()-zurück > i ; i++) { 
 	

    	image.setColor(getForeground());


	    Rectangle p = (Rectangle)undo.elementAt(i);
	    image.setColor((Color)Rcolor.elementAt(i));
	    image.drawRect(p.x, p.y, p.width, p.height);

	
repaint();  
          
         }

Hab mir schon gedacht bei jedem weiteren zeichnen zurück zu erhöhen geht aber nicht.
Hat jemand eine gute Idee???
 

Marco13

Top Contributor
Ich hab sogar mehrere Ideen: Auf Rechtschreibung achten. Auf Grammatik achten. Auf Zeichensetzung achten.

Aber am wichtigsten: Compilierbaren code posten.

Sonst kann man nur raten und vermuten, WAS du da WANN machst, und was sowas wie "mode" sein soll....
 

Marco13

Top Contributor
Klicken um Rechtecke zu setzen.
Code:
import java.awt.*;
import java.util.*;
import java.awt.event.*;
import javax.swing.*;

class UndoTest extends JPanel implements MouseListener
{
    public static void main(String args[])
    {
        JFrame f = new JFrame();
        f.getContentPane().setLayout(new BorderLayout());

        final UndoTest ut = new UndoTest();
        ut.addMouseListener(ut);
        f.getContentPane().add(ut, BorderLayout.CENTER);


        JButton b = new JButton("Undo");
        b.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                ut.undo();
            }
        });
        f.getContentPane().add(b, BorderLayout.NORTH);

        b = new JButton("Redo");
        b.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                ut.redo();
            }
        });
        f.getContentPane().add(b, BorderLayout.SOUTH);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setSize(400,400);
        f.setVisible(true);
    }

    private ArrayList<Shape> drawn = new ArrayList<Shape>();
    private ArrayList<Shape> undone = new ArrayList<Shape>();

    public void mouseEntered(MouseEvent e) {}
    public void mouseExited(MouseEvent e) {}
    public void mousePressed(MouseEvent e) {}
    public void mouseReleased(MouseEvent e) {}
    public void mouseClicked(MouseEvent e)
    {
        Rectangle r = new Rectangle(e.getX(), e.getY(), 10, 10);
        drawn.add(r);
        repaint();
    }

	public void undo()
	{
		if (drawn.size() == 0) return;
		Shape s = drawn.get(drawn.size()-1);
		drawn.remove(drawn.size()-1);
		undone.add(s);
		repaint();
	}

	public void redo()
	{
		if (undone.size() == 0) return;
		Shape s = undone.get(undone.size()-1);
		undone.remove(undone.size()-1);
		drawn.add(s);
		repaint();
	}


    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        g.setColor(Color.black);
        for (Shape s : drawn)
        {
            ((Graphics2D)g).draw(s);
        }
    }
}
 

anfänger15

Bekanntes Mitglied
Marco13:
Ich hab sogar mehrere Ideen: Auf Rechtschreibung achten. Auf Grammatik achten. Auf Zeichensetzung achten.

dazu kann ich nur sagen, deutsche Sprache schwere Sprache.

Marco13:
Aber am wichtigsten: Compilierbaren code posten.

Danke für den Code oben, aber dein Code ist bei mir auch nicht compilierbar![/b]
 

Chris_1980

Bekanntes Mitglied
OMG, da bekommst du n komplettes KSKB was kompilier- und auch ausführbar ist und dann sowas... :shock:
 

anfänger15

Bekanntes Mitglied
Entschuldigung aber wenn ich das bei mir compilier kommt folgendes:
Code:
C:\Dokumente und Einstellungen\Luki\Desktop\Bildbetrachter\UndoTest.java:42: <identifier> expected
    private ArrayList<Shape> drawn = new ArrayList<Shape>(); 
                     ^
C:\Dokumente und Einstellungen\Luki\Desktop\Bildbetrachter\UndoTest.java:43: <identifier> expected
    private ArrayList<Shape> undone = new ArrayList<Shape>(); 
                     ^
C:\Dokumente und Einstellungen\Luki\Desktop\Bildbetrachter\UndoTest.java:79: ';' expected
        for (Shape s : drawn) 
                     ^
C:\Dokumente und Einstellungen\Luki\Desktop\Bildbetrachter\UndoTest.java:83: illegal start of expression
    } 
    ^
C:\Dokumente und Einstellungen\Luki\Desktop\Bildbetrachter\UndoTest.java:82: ';' expected
        } 
         ^
C:\Dokumente und Einstellungen\Luki\Desktop\Bildbetrachter\UndoTest.java:52: cannot resolve symbol
symbol  : variable drawn  
location: class UndoTest
        drawn.add(r); 
        ^
C:\Dokumente und Einstellungen\Luki\Desktop\Bildbetrachter\UndoTest.java:58: cannot resolve symbol
symbol  : variable drawn  
location: class UndoTest
      if (drawn.size() == 0) return; 
          ^
C:\Dokumente und Einstellungen\Luki\Desktop\Bildbetrachter\UndoTest.java:59: cannot resolve symbol
symbol  : variable drawn  
location: class UndoTest
      Shape s = drawn.get(drawn.size()-1); 
                          ^
C:\Dokumente und Einstellungen\Luki\Desktop\Bildbetrachter\UndoTest.java:59: cannot resolve symbol
symbol  : variable drawn  
location: class UndoTest
      Shape s = drawn.get(drawn.size()-1); 
                ^
C:\Dokumente und Einstellungen\Luki\Desktop\Bildbetrachter\UndoTest.java:60: cannot resolve symbol
symbol  : variable drawn  
location: class UndoTest
      drawn.remove(drawn.size()-1); 
                   ^
C:\Dokumente und Einstellungen\Luki\Desktop\Bildbetrachter\UndoTest.java:60: cannot resolve symbol
symbol  : variable drawn  
location: class UndoTest
      drawn.remove(drawn.size()-1); 
      ^
C:\Dokumente und Einstellungen\Luki\Desktop\Bildbetrachter\UndoTest.java:61: cannot resolve symbol
symbol  : variable undone  
location: class UndoTest
      undone.add(s); 
      ^
C:\Dokumente und Einstellungen\Luki\Desktop\Bildbetrachter\UndoTest.java:67: cannot resolve symbol
symbol  : variable undone  
location: class UndoTest
      if (undone.size() == 0) return; 
          ^
C:\Dokumente und Einstellungen\Luki\Desktop\Bildbetrachter\UndoTest.java:68: cannot resolve symbol
symbol  : variable undone  
location: class UndoTest
      Shape s = undone.get(undone.size()-1); 
                           ^
C:\Dokumente und Einstellungen\Luki\Desktop\Bildbetrachter\UndoTest.java:68: cannot resolve symbol
symbol  : variable undone  
location: class UndoTest
      Shape s = undone.get(undone.size()-1); 
                ^
C:\Dokumente und Einstellungen\Luki\Desktop\Bildbetrachter\UndoTest.java:69: cannot resolve symbol
symbol  : variable undone  
location: class UndoTest
      undone.remove(undone.size()-1); 
                    ^
C:\Dokumente und Einstellungen\Luki\Desktop\Bildbetrachter\UndoTest.java:69: cannot resolve symbol
symbol  : variable undone  
location: class UndoTest
      undone.remove(undone.size()-1); 
      ^
C:\Dokumente und Einstellungen\Luki\Desktop\Bildbetrachter\UndoTest.java:70: cannot resolve symbol
symbol  : variable drawn  
location: class UndoTest
      drawn.add(s); 
      ^
18 errors

Process completed.

Und ich kann auch nichts dafür das ich ne Rechtschreibschwäche hab, aber falls ich was falsch gemacht hab Entschuldigung.
Danke für deine Hilfe, die undo-Funktion geht jetzt, hab es aber mit einem Stack gemacht.

Sorry sorry sorry!!!!!!
 

Marco13

Top Contributor
Das mit der Rechtschreibung bezog sich primär(!) darauf, dass ich deinen ersten Post 3 oder 4 mal lesen musste, bis ich gemerkt habe, dass an einer Stelle, wo du das Wort "und" geschrieben hast, eigentlich "undo" gemeint war :D das kann schon verwirrend sein :wink:

Und ... ja, es muss mit Java 1.5 compiliert werden. Die Alternative ist: Alles, was mit <spitzen Klammern> zu tun hat, wegmachen, die for-Schleife entsprechend als for(int i...) schreiben, und ggf. casten.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Best Practices für Undo/Redo Allgemeine Java-Themen 16
J Undo auf eine ArrayList implementieren Allgemeine Java-Themen 3
G "mehr" undo Allgemeine Java-Themen 8
Alex_99 Programm stürzt beim Aufruf der Funktion ab? Text ausgeben Allgemeine Java-Themen 45
_user_q Was brauche ich, um eine eigene "Search for updates"-Funktion einzubauen? Allgemeine Java-Themen 1
Tobero Meine Funktion für das beinhalten eines Punktes in einem Kreis funktioniert nicht Allgemeine Java-Themen 5
S Validation Annotation Funktionsparameter vs Funktion vs Attribut Allgemeine Java-Themen 0
R Variablen String mit split-Funktion aufteilen Allgemeine Java-Themen 7
A Serialize - Add Funktion Allgemeine Java-Themen 1
B Discord Bot - Funktion wird nicht aufgerufen Allgemeine Java-Themen 1
A Variablen Funktion übergibt den Wert nicht Allgemeine Java-Themen 13
J Überschriebene Funktion soll nicht die super Funktion aufrufen Allgemeine Java-Themen 4
Aruetiise Funktion(y = mx+n) in String speichern und berechnen Allgemeine Java-Themen 9
B Hilfe!! spiel um Funktion des Selektierens erweitern (mit ASCII-Tabelle) Allgemeine Java-Themen 3
MiMa ArrayList Rückgabewerte aus einer Funktion Allgemeine Java-Themen 15
B Gibt es eine Funktion die den Datentyp einer Variablen ermittelt? Allgemeine Java-Themen 8
A Plot funktion applet Allgemeine Java-Themen 4
S Methoden "Unschöne" Break-Anweisung aus verschachtelter Funktion entfernen Allgemeine Java-Themen 11
R Rückgabe eines Arrays durch Funktion Allgemeine Java-Themen 9
T Best Practice MD5 Funktion Allgemeine Java-Themen 9
perlenfischer1984 Testng : Funktion mit mehreren Parametern testen Allgemeine Java-Themen 5
L Stack overflow bei einer endrekursiven Funktion (Anwendung: Spezialform des Package Merge) Allgemeine Java-Themen 4
C Klassen Problem mit Funktion einer Generischen Klasse die ein Interface implementiert Allgemeine Java-Themen 0
O JNA Zugriff auf Funktion aus DLL Allgemeine Java-Themen 0
Lord.Djerun (Taschenrechner) jButtons mit gleicher Funktion zusammenfassen Allgemeine Java-Themen 6
I Javafx Open/Read und Tree Funktion Allgemeine Java-Themen 14
C Generic-Funktion nur bei bestimmten Typen erlauben Allgemeine Java-Themen 6
F Classpath als Argument in Funktion übergeben Allgemeine Java-Themen 3
H SHA256 update-Funktion Allgemeine Java-Themen 3
J Methoden Abgeänderte Fibonacci Funktion Allgemeine Java-Themen 2
G Polymorphie Funktion als Parameter Allgemeine Java-Themen 8
F Funktion nur in einem Zeitraum Allgemeine Java-Themen 5
H java.util.Timer und Funktion mit SQL Exception Allgemeine Java-Themen 5
M Anzahl der Durchläufe einer Funktion errechnen Allgemeine Java-Themen 6
J Autofill Funktion Uhrzeit Allgemeine Java-Themen 19
G Timeout funktion zu einer Eventlogabfrage Allgemeine Java-Themen 2
M Funktion gesucht: Text vektorisieren Allgemeine Java-Themen 20
K Warum wartet diese Funktion auf beenden des Threads? Allgemeine Java-Themen 3
N JNI Callback Funktion Allgemeine Java-Themen 8
D Problem bei der Darstellung einer trigonometrischen Funktion Allgemeine Java-Themen 2
E Funktion sperren bis Unterfunktionen ferig sind Allgemeine Java-Themen 3
D Referenz einer Funktion aus einer anonymen Klasse? Allgemeine Java-Themen 3
J Funktion zu einer Uhrzeit/datum ausführen Allgemeine Java-Themen 4
S eigene Update Funktion Allgemeine Java-Themen 5
Ark Name für Funktion gesucht Allgemeine Java-Themen 5
Screen Eine mathematische Funktion als Argument für eine Methode - Matheparser? Allgemeine Java-Themen 21
Daniel_L Bug in Copy-Funktion bei HTML-Editorpane? Allgemeine Java-Themen 4
multiholle Aufrufer einer Funktion ermitteln Allgemeine Java-Themen 13
W JMF- Player.getDuration() Funktion spinnt Allgemeine Java-Themen 2
C JTextComponent - mit Schlagwörter Funktion aufrufen Allgemeine Java-Themen 2
SuperSeppel13 php-funktion aufrufen Allgemeine Java-Themen 5
M get Funktion von Vector Allgemeine Java-Themen 4
V Wie Enum an Funktion "übergeben" ? Allgemeine Java-Themen 4
G Webserver Funktion Allgemeine Java-Themen 3
S Random funktion in einer Grafischen Oberfläche Allgemeine Java-Themen 10
C Funktion stoppt alles Allgemeine Java-Themen 7
G Funktion aus array aufrufen Allgemeine Java-Themen 16
P Funktion vorhanden - wie auf Transitivität erweitern? Allgemeine Java-Themen 6
N Funktion als Parameter einer anderen Funktion Allgemeine Java-Themen 5
lumo Row Header ist public, zeigt die funktion aber nicht public Allgemeine Java-Themen 8
P Unterschied zwischen Funktion und Methoden Allgemeine Java-Themen 3
B E-Funktion mit Java Allgemeine Java-Themen 9
S verstehe diese Funktion nicht Allgemeine Java-Themen 6
S Referenz auf Funktion? Allgemeine Java-Themen 16
K Funktion unabhängig vom Namen aufrufen Allgemeine Java-Themen 5
F Vorteile -> Funktion Allgemeine Java-Themen 2
P gegenstück zur php funktion gzinflate()? Allgemeine Java-Themen 3
D Problem bei Aufruf einer Funktion Allgemeine Java-Themen 3
J Welche Daten für Ative-X Funktion? Allgemeine Java-Themen 5
X Replay Funktion realisieren? Allgemeine Java-Themen 5
J Funktion alle Möglichkeiten berücksichtigen Allgemeine Java-Themen 5
P DLL Funktion benutzen Allgemeine Java-Themen 3
S Fortran Funktion mit JNI aufrufen: java.lang.UnsatisfiedLink Allgemeine Java-Themen 2
T Pipe-Funktion - Prozente falsch? Allgemeine Java-Themen 8
J Method.invoke -> Exceptions der Funktion abfangen Allgemeine Java-Themen 5
M Frage zu resume funktion bei downloadmanager Allgemeine Java-Themen 7
M Funktion liest nach Textaus aus der vorigen Zeile Allgemeine Java-Themen 2
G nichtabstrakte Funktion zu einer Interface hinzufügen Allgemeine Java-Themen 6
M Funktion des JRE Allgemeine Java-Themen 8
B Nach Deserialisieren: Elemente des JFrames ohne Funktion Allgemeine Java-Themen 5
A funktion schiffeZeichnen zwei mal aufrufen Allgemeine Java-Themen 16
P Suche String Tutorial zu Suche&Ersetze Funktion von text Allgemeine Java-Themen 35
D Mathematische Funktion grafisch in Java darstellen Allgemeine Java-Themen 2
7 Gibts in Java ne Funktion, die ein ganzes Array ausgibt Allgemeine Java-Themen 11
L sin cos funktion Allgemeine Java-Themen 5
L return-Funktion Allgemeine Java-Themen 5
L return Funktion Allgemeine Java-Themen 6
M Funktion als Parameter oder andere Möglichkeit Allgemeine Java-Themen 3
H Funktion aus einer anderen Klasse ausführen Allgemeine Java-Themen 3
TRunKX Gibt es ne fertige Java Funktion die Dateien vergleicht? Allgemeine Java-Themen 4
M Funktion wird nicht durchlaufen. Allgemeine Java-Themen 13
G Bilder zeichnen und Zoom Funktion Allgemeine Java-Themen 2
G java funktion in JSP file aufrufen. Allgemeine Java-Themen 2
K funktion aus einem String aufrufen Allgemeine Java-Themen 9
L C# Funktion in Java aufrufen Allgemeine Java-Themen 4
thE_29 Funktion mit Funktionaufrufen Allgemeine Java-Themen 4
G Funktion, die langsam wächst Allgemeine Java-Themen 7
M Geschwindigkeitssteigerung für Malprogramm Allgemeine Java-Themen 3

Ähnliche Java Themen

Neue Themen


Oben