Clear Canvas und anschließendes neues Erstellen von Objekten auf Canvas aus ArrayList

wolfin96

Mitglied
Hallo miteinander! Bei meinem Programm werden auf der Oberfläche in einem Canvas Rechtecke gezeichnet. Diese Rechtecke werden wie ein Stapel übereinander angezeigt. Die Daten zu jedem einzelnen Rechteck (xStartpunk, yStartpunk, breite, bezeichnung) werden in einem Objekt (RechteckDaten) gespeichert und dieses Objekt wird dann der Reihenfolge nach in einer ArrayList gespeichert. Nun bin ich gerade dabei eine Methode zu schreiben, die immer das oberste Rechteck entfernen soll. Dazu wird in der Methode zum entfernen zuerst das letzte Objekt aus der ArrayList gelöscht. Dann wird der ganze Canvas geleert und danach soll mit einer for-Schleife die ArrayList abgegangen werden um wieder das Canvas mit den verbliebenen Dreiecken zu füllen. Generell funktioniert das auch, die Objekte werden entsprechend in der ArrayList gespeichert und das letzte Objekt wird auch gelöscht. Nur scheint in der for-Schleife oder in der Methode die die Rechtecke zeichnet ein Problem zu sein, da nämlich nach dem Entfernen immer nur jedes zweite Rechteckt wieder dargestellt wird. Hier mal ein Beispiel:
- vorher vier Rechtecke, Objekte haben index in der ArrayList 0,1,2,3
- dann wird das Objekt mit index 3 entfernt
- auf dem Canvas werden dann aber nur die Objekte mit Index 0 und 2 gezeichnet, 1 wird ausgelassen
- vergrößert man das Beispiel, ist es das selbe Spiel, es wird jedes zweite Element nicht dargestellt.

Hier einmal der zugehörige Code der Methode zum entfernen des Rechtecks mit der for-Schleife zum erneuten zeichnen:
Java:
             //anzahlElemente zählt die vorhandenen Rechtecke
            //Subtrahieren von 1 von anzahlElemente, wenn ein Stein abgenommen wird
            anzahlElemente--;
        
            //aktualisieren des Labels welches das aktuelle Stapelgewicht anzeigt
            aktuellesGewichtLabel.setText(spielStapel.getStapelGewicht());
        
            //Aufrufen des Graphicscontext zum Zeichnen der Steine auf der GUI
            GraphicsContext g = stapelCanvas.getGraphicsContext2D();
        
            //Loeschen der angezeigten Steine bevor die noch vorhandenen Steine wieder angezeigt werden
            g.clearRect(0, 0, 355, 359);
        
            //Loeschen des zuletzt hinzugefuegten Rechtecks aus der ArrayList
            speicherRechtecke.remove(anzahlElemente);
        
          //Schleife zum zeichnen der verbliebenen Rechtecke
            for(int i = 0; i < speicherRechtecke.size(); i++) {
                RechteckDaten stein = speicherRechtecke.get(i);
                zeichneRechtecke(stein.getX(), stein.getY(), stein.getBreite(), stein.getForm());
                i++;
            }
        
     ;

Hier noch die Methode, die aufgerufen wird um die Rechtecke zu zeichnen:

Java:
    private void zeichneRechtecke(double x, int y, double breite, String typ) {
        //festlegen der Hoehe der Spielsteine in der GUI
        int hoehe = 15;
    
        //Aufrufen des Graphicscontext zum Zeichnen der Steine auf der GUI
        GraphicsContext g = stapelCanvas.getGraphicsContext2D();
        
        //Erstellen des Rechtecks auf der GUI
        g.strokeRect(x, y, breite, hoehe);
    
        //Hinzufuegen eines Textes zum Spielstein
        g.strokeText(typ, x + breite + 5, y + 10 );
    
    }

Vielleicht hat ja einer von euch eine Idee oder sieht meinen Denkfehler... 😅
Vielen Dank schon mal für eure Hilfe!
 

Robert Zenz

Top Contributor
Java:
for(int i = 0; i < speicherRechtecke.size(); i++) {
    RechteckDaten stein = speicherRechtecke.get(i);
    zeichneRechtecke(stein.getX(), stein.getY(), stein.getBreite(), stein.getForm());
    i++;
}
Lies dir das nochmal Zeile fuer Zeile durch. Wenn das nicht hilft, lass dir jedes Rechteck, und den zugehoerigen Index, ausgeben auf der Konsole.

Auszerdem kannst du an der Stelle eine for-each verwenden.
 

wolfin96

Mitglied
Lies dir das nochmal Zeile fuer Zeile durch. Wenn das nicht hilft, lass dir jedes Rechteck, und den zugehoerigen Index, ausgeben auf der Konsole.

Auszerdem kannst du an der Stelle eine for-each verwenden.
Habe mir jetzt mal den Index beim speichern und beim wieder zeichnen ausgeben lassen. Das Problem scheint schon beim Speichern zu sein, hier wird aus irgendeinem Grund nur jedes zweite Rechteck gespeichert, als Index 0,2,4 usw... Index 1,3,5 wird nicht belegt bzw. übersprungen...

Hier mal der Code in dem die Objekte ins Array geschrieben werden:
Java:
        if((spielStapel.berechneStapelgewicht() + steinZumAuflegen.getGewicht() <= spielStapel.getMaxGewicht())) {
           
            String form = steinZumAuflegen.getForm();
           
            double startX;
               
            if(anzahlElemente == 0) {
               
                startX = 30;
               
                if(form.equals("Zylinder (rund)")) {
                           
                    spielStapel.steinAuflegen(steinZumAuflegen);

                    //Zeichnen des Rechtecks auf dem Canvas
                    zeichneRechtecke(startX, startY, steinZumAuflegen.getLangeSeite() * 2 * 7, "rund");
                   
                    startY -= 15;

                    //Erstellen des Objektes mit den Daten des Rechtecks                   
                    RechteckDaten daten = new RechteckDaten(startX, startY, steinZumAuflegen.getLangeSeite() * 2 * 7, "rund");
                   
                    //Speichern des Objektes mit den Daten in der ArrayList
                    speicherRechtecke.add(anzahlElemente, daten);
                   
                    //anzahlElemente wird um eins erhoeht, wenn Stein hinzugefuegt wurde
                    anzahlElemente++;
                   
                } else if (form.equals("Quader (rechteckig)")) {

                   
                    spielStapel.steinAuflegen(steinZumAuflegen);
                    zeichneRechtecke(startX, startY, steinZumAuflegen.getLangeSeite() * 7, "rechteckig");
                   
                    startY -= 15;
                                       
                    RechteckDaten daten = new RechteckDaten(startX, startY, steinZumAuflegen.getLangeSeite() * 7, "rechteckig");
                   
                    speicherRechtecke.add(anzahlElemente, daten);
                   
                    //anzahlElemente wird um eins erhoeht, wenn Stein hinzugefuegt wurde
                    anzahlElemente++;
                   
                } else {

                   
                    spielStapel.steinAuflegen(steinZumAuflegen);
                    zeichneRechtecke(startX, startY, steinZumAuflegen.getLangeSeite() * 7, "quadratisch");
                   
                    startY -= 15;
                                       
                    RechteckDaten daten = new RechteckDaten(startX, startY, steinZumAuflegen.getLangeSeite() * 7, "quadratisch");
                   
                    speicherRechtecke.add(anzahlElemente, daten);
                   
                    //anzahlElemente wird um eins erhoeht, wenn Stein hinzugefuegt wurde
                    anzahlElemente++;
                   
                }
            } else {   
               
                if(spielStapel.getFirstType().equals("Zylinder (rund)")) {
                    if(form == "Zylinder (rund)") {
                       
                        double startXneu = 30 + ((spielStapel.getFirstBreite().getLangeSeite() * 7)) - ((steinZumAuflegen.getLangeSeite() * 7));
                               
                        spielStapel.steinAuflegen(steinZumAuflegen);
                        zeichneRechtecke(startXneu, startY, steinZumAuflegen.getLangeSeite() * 2 * 7, "rund");
                       
                        startY -= 15;                       
                               
                        RechteckDaten daten = new RechteckDaten(startXneu, startY, steinZumAuflegen.getLangeSeite() * 2 * 7, "rund");
                       
                        speicherRechtecke.add(anzahlElemente, daten);
                       
                        //anzahlElemente wird um eins erhoeht, wenn Stein hinzugefuegt wurde
                        anzahlElemente++;
                       
                    } else if (form.equals("Quader (rechteckig)")) {
                        double startXneu = 30 + ((spielStapel.getFirstBreite().getLangeSeite() * 7)) - ((steinZumAuflegen.getLangeSeite() * 7) / 2);
       
                       
                        spielStapel.steinAuflegen(steinZumAuflegen);
                        zeichneRechtecke(startXneu, startY, steinZumAuflegen.getLangeSeite() * 7, "rechteckig");
                       
                        startY -= 15;
                                               
                        RechteckDaten daten = new RechteckDaten(startXneu, startY, steinZumAuflegen.getLangeSeite() * 7, "rechteckig");
                       
                        speicherRechtecke.add(anzahlElemente, daten);
                       
                        //anzahlElemente wird um eins erhoeht, wenn Stein hinzugefuegt wurde
                        anzahlElemente++;
                       
                    } else {
                        double startXneu = 30 + ((spielStapel.getFirstBreite().getLangeSeite() * 7)) - ((steinZumAuflegen.getLangeSeite() * 7) / 2);
       
                       
                        spielStapel.steinAuflegen(steinZumAuflegen);
                        zeichneRechtecke(startXneu, startY, steinZumAuflegen.getLangeSeite() * 7, "quadratisch");
                       
                        startY -= 15;
                                               
                        RechteckDaten daten = new RechteckDaten(startXneu, startY, steinZumAuflegen.getLangeSeite() * 7, "rund");
                       
                        speicherRechtecke.add(anzahlElemente, daten);
                       
                        //anzahlElemente wird um eins erhoeht, wenn Stein hinzugefuegt wurde
                        anzahlElemente++;
                    }
                   
                } else {
                    if(form.equals("Zylinder (rund)")) {
                        double startXneu = 30 + ((spielStapel.getFirstBreite().getLangeSeite() * 7)  / 2 ) - ((steinZumAuflegen.getLangeSeite() * 7));
                               
                        spielStapel.steinAuflegen(steinZumAuflegen);
                        zeichneRechtecke(startXneu, startY, steinZumAuflegen.getLangeSeite() * 2 * 7, "rund");
                       
                        startY -= 15;                       
                                   
                        RechteckDaten daten = new RechteckDaten(startXneu, startY, steinZumAuflegen.getLangeSeite() * 2 * 7, "rund");
                       
                        speicherRechtecke.add(anzahlElemente, daten);
                       
                        //anzahlElemente wird um eins erhoeht, wenn Stein hinzugefuegt wurde
                        anzahlElemente++;
                       
                    } else if (form.equals("Quader (rechteckig)")) {
                        double startXneu = 30 + ((spielStapel.getFirstBreite().getLangeSeite() * 7) / 2 ) - ((steinZumAuflegen.getLangeSeite() * 7) / 2);
       
                       
                        spielStapel.steinAuflegen(steinZumAuflegen);
                        zeichneRechtecke(startXneu, startY, steinZumAuflegen.getLangeSeite() * 7, "rechteckig");
                       
                        startY -= 15;
                                               
                        RechteckDaten daten = new RechteckDaten(startXneu, startY, steinZumAuflegen.getLangeSeite() * 7, "rechteckig");
                       
                        speicherRechtecke.add(anzahlElemente, daten);
                       
                        //anzahlElemente wird um eins erhoeht, wenn Stein hinzugefuegt wurde
                        anzahlElemente++;
                       
                    } else {
                        double startXneu = 30 + ((spielStapel.getFirstBreite().getLangeSeite() * 7) / 2 ) - ((steinZumAuflegen.getLangeSeite() * 7) / 2);
       
                       
                        spielStapel.steinAuflegen(steinZumAuflegen);
                        zeichneRechtecke(startXneu, startY, steinZumAuflegen.getLangeSeite() * 7, "quadratisch");
                       
                        startY -= 15;
                                               
                        RechteckDaten daten = new RechteckDaten(startXneu, startY, steinZumAuflegen.getLangeSeite() * 7, "quadratisch");
                       
                        speicherRechtecke.add(anzahlElemente, daten);
                       
                        //anzahlElemente wird um eins erhoeht, wenn Stein hinzugefuegt wurde
                        anzahlElemente++;
                       
                    }
                }           
           
                //aktualisieren des Labels, welches das aktuelle Stapelgewicht abbildet
                aktuellesGewichtLabel.setText(spielStapel.getStapelGewicht());
           
            }
           
          }
           
        }
Das ist der komplette Code, es gibt viele verschiedene Bedingungen, die nur Kleinigkeiten unterscheiden, aber in denen ist dann der Ablauf im Endeffekt immer der Gleiche.
Hierbei ist die Zählvariable anzahlElemente logischerweise am Anfang null und wird erhöht sobald ein Objekt hinzugefügt wird. Dementsprechend wird das Objekt dann auch an der Stelle in die ArrayList geschrieben. Oder steht die Erhöhung der Zählvariable hier an der falschen Stelle?
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
M clear JPanel before repainting AWT, Swing, JavaFX & SWT 1
A Swing Paint mit Button Clear den Hintergrund säubern um wieder zeichnen zu können AWT, Swing, JavaFX & SWT 2
lumo SWT GridLayout - clear? AWT, Swing, JavaFX & SWT 4
H JavaFX Canvas neu zeichnen anstoßen AWT, Swing, JavaFX & SWT 34
H JavaFX Gedrehter Text auf Canvas (Positionierung) AWT, Swing, JavaFX & SWT 6
ExceptionOfExpectation Textdarstellung auf einem Canvas mit Hilfe von repaint(); AWT, Swing, JavaFX & SWT 6
W Canvas oder Polygone? AWT, Swing, JavaFX & SWT 3
Monokuma Canvas Form entfernen AWT, Swing, JavaFX & SWT 2
Monokuma KeyEvent in der Canvas Klasse AWT, Swing, JavaFX & SWT 0
M Internal Frames und Canvas-Element AWT, Swing, JavaFX & SWT 9
TheJavaKid Auf eine Zeichnung im Canvas reagieren AWT, Swing, JavaFX & SWT 13
M Halbkreiszeichnen(Canvas) - Diesen mit Mouseevents bestücken AWT, Swing, JavaFX & SWT 3
dereki2000 AWT Canvas zeichnet nicht AWT, Swing, JavaFX & SWT 7
D Canvas oder scene graph? AWT, Swing, JavaFX & SWT 16
J Canvas wird nicht angezeigt AWT, Swing, JavaFX & SWT 10
Y Objekte grafisch darstellen ohne GMF - Composite auf Canvas? AWT, Swing, JavaFX & SWT 2
Prafy AWT Klickbare Bereiche auf Canvas AWT, Swing, JavaFX & SWT 2
J JavaFX JavaFX Canvas einfaches Zeichenprogramm AWT, Swing, JavaFX & SWT 7
P MalProgramm mit JScrollPane und Canvas AWT, Swing, JavaFX & SWT 2
Cromewell JavaFX Nur bestimmten Teil eines Canvas rendern und anzeigen AWT, Swing, JavaFX & SWT 2
N Swing Benötige Hilfe um ein Swing Canvas zu speichern AWT, Swing, JavaFX & SWT 4
L JavaFX Canvas max size? AWT, Swing, JavaFX & SWT 1
J JavaFX Rendering von Canvas sehr langsam AWT, Swing, JavaFX & SWT 2
P AWT Canvas freihändig zeichnen AWT, Swing, JavaFX & SWT 1
Regedit JavaFX Java Canvas hört ständig auf zu aktualisieren/malen AWT, Swing, JavaFX & SWT 3
H JavaFX Freezes beim Zeichnen mit Canvas AWT, Swing, JavaFX & SWT 3
Z Canvas in Frame einfügen. Problem mit 4-Gewinnt AWT, Swing, JavaFX & SWT 1
B JavaFX KeyEvent und Canvas draw Problem AWT, Swing, JavaFX & SWT 9
K Fragen zu JavaFx Canvas AWT, Swing, JavaFX & SWT 0
C Java FX Canvas missing getGraphicContext2D AWT, Swing, JavaFX & SWT 5
windl Overlay mit Transparentem JWindow und Canvas AWT, Swing, JavaFX & SWT 2
S JavaFX Canvas - nur eine Figur auf der Zeichenfläche färben? AWT, Swing, JavaFX & SWT 1
R JComponent auf Canvas AWT, Swing, JavaFX & SWT 8
S Canvas durch transparentes JPanel sichtbar machen AWT, Swing, JavaFX & SWT 2
A JavaFX Menubar wird von Canvas überzeichnet AWT, Swing, JavaFX & SWT 8
antonbracke Multiplayer Shooter- Wie geht das mit Canvas & Graphics AWT, Swing, JavaFX & SWT 6
Luk10 KeyBindings mit Canvas? AWT, Swing, JavaFX & SWT 3
B LookAndFeel GWT: Canvas in TabSet nicht sichtbar AWT, Swing, JavaFX & SWT 2
K canvas zeig nach repaint nichts an AWT, Swing, JavaFX & SWT 8
T Canvas clipping AWT, Swing, JavaFX & SWT 4
S 2 Canvas übereinander AWT, Swing, JavaFX & SWT 2
S 2D-Grafik Canvas Problem(Größe) AWT, Swing, JavaFX & SWT 6
K 3D-Grafik Canvas ist ein eigener Frame?! AWT, Swing, JavaFX & SWT 13
F Canvas Objekt außerhalb des Frames zeichnen AWT, Swing, JavaFX & SWT 3
M Wofür Canvas? AWT, Swing, JavaFX & SWT 5
frankred Swing Canvas nach "Window-resize" neu Zeichnen lassen wegen Anzeigefehler AWT, Swing, JavaFX & SWT 4
S Canvas in ScrollPane wird beim scrollen immer neu gezeichnet AWT, Swing, JavaFX & SWT 3
F Nur ein Objekt auf Canvas neu zeichnen AWT, Swing, JavaFX & SWT 4
B AWT Canvas überdeckt nach repaint() JComboBox-Optionen AWT, Swing, JavaFX & SWT 2
lumo SWT Canvas transparent AWT, Swing, JavaFX & SWT 4
2 AWT Zeichnen in Canvas AWT, Swing, JavaFX & SWT 5
B 2D-Grafik Malen/übermalen mit Canvas AWT, Swing, JavaFX & SWT 5
L Dynamisch Objekte in Canvas zeichnen AWT, Swing, JavaFX & SWT 5
G Auf Canvas zeichnen nur über boolean-Abfragen? AWT, Swing, JavaFX & SWT 5
S Canvas-Inhalt in Laufzeit ändern AWT, Swing, JavaFX & SWT 6
R In JFrame oder in Canvas mit grafischen Elemente zeichnen AWT, Swing, JavaFX & SWT 2
I Canvas Repaint Probleme AWT, Swing, JavaFX & SWT 2
S Bild wird auf Canvas in Applet nicht gezeichnet AWT, Swing, JavaFX & SWT 4
G SWT Linie unter transparentes Canvas zeichnen AWT, Swing, JavaFX & SWT 4
F Swing Paint mit Canvas Element AWT, Swing, JavaFX & SWT 35
S SWT Canvas: Flackernde Bilder AWT, Swing, JavaFX & SWT 3
T AWT canvas AWT, Swing, JavaFX & SWT 3
P Canvas: String wird nicht gezeichnet AWT, Swing, JavaFX & SWT 5
T SWT Canvas Koordinaten per MouseMove auslesen AWT, Swing, JavaFX & SWT 1
H Zeichnen auf smartgwt Canvas AWT, Swing, JavaFX & SWT 4
G Drag and Drop JTree to Canvas AWT, Swing, JavaFX & SWT 7
K Swing Sinuskurve zeichnen auf Canvas AWT, Swing, JavaFX & SWT 2
M AWT Component/Canvas erzeugt unerwünschten Rahmen bei paint AWT, Swing, JavaFX & SWT 3
J Canvas / paint() AWT, Swing, JavaFX & SWT 2
D Canvas soll angezeigtes jpg-Bild aktualisieren AWT, Swing, JavaFX & SWT 4
N zeichnen auf awt canvas AWT, Swing, JavaFX & SWT 9
G Ein Wort in einem String färben in einer Canvas AWT, Swing, JavaFX & SWT 10
J Canvas Inhalt als Bild speichern! AWT, Swing, JavaFX & SWT 16
T zeichnen mit canvas AWT, Swing, JavaFX & SWT 3
S repaint im Canvas AWT, Swing, JavaFX & SWT 3
D Canvas und Buttons AWT, Swing, JavaFX & SWT 20
P Zeichnen in Canvas und Neuzeichnen AWT, Swing, JavaFX & SWT 3
G Canvas + Swing-Objekte AWT, Swing, JavaFX & SWT 5
C canvas.draw zeichne ohne ausfüllen AWT, Swing, JavaFX & SWT 9
P Canvas in JFrame mit GridLayout AWT, Swing, JavaFX & SWT 4
B Graphics und Canvas - Problem AWT, Swing, JavaFX & SWT 2
T Canvas gegen Container austauschen --> GUI fehlt AWT, Swing, JavaFX & SWT 4
P Canvas Inhalt löschen AWT, Swing, JavaFX & SWT 4
D Canvas über JMenuBar AWT, Swing, JavaFX & SWT 7
F ToolTip auf Canvas AWT, Swing, JavaFX & SWT 2
L Probleme mit mehreren Canvas: Überlagerungseffekte? AWT, Swing, JavaFX & SWT 5
N Zu hoher Speicherverbrauch beim Zeichnen (Canvas) AWT, Swing, JavaFX & SWT 5
G Canvas im JPanel - "Freie" Fläche Problem AWT, Swing, JavaFX & SWT 10
T Textfeldwert in canvas AWT, Swing, JavaFX & SWT 4
D cannot access Canvas AWT, Swing, JavaFX & SWT 13
G Canvas in SWT aktualisieren AWT, Swing, JavaFX & SWT 21
S AUF Canvas Zeichnen Fehler! AWT, Swing, JavaFX & SWT 10
G Canvas löschen AWT, Swing, JavaFX & SWT 15
H Sowas wie ein Canvas AWT, Swing, JavaFX & SWT 3
D Inhalt einer Canvas löschen (SWT.NO_BACKGROUND gesetzt) AWT, Swing, JavaFX & SWT 3
G GridBagLayout mit Canvas-Positionsproblem AWT, Swing, JavaFX & SWT 5
J Canvas und JTextField AWT, Swing, JavaFX & SWT 2
T erkennen ob innerhalb oder außerhalb von canvas gezeichnet AWT, Swing, JavaFX & SWT 2
S Problemen mit Canvas-Objekten im GridLayout AWT, Swing, JavaFX & SWT 8
P Tranparentes Canvas AWT, Swing, JavaFX & SWT 8

Ähnliche Java Themen

Neue Themen


Oben