Falsche Reihenfolge von Methodenaufrufen

Status
Nicht offen für weitere Antworten.
S

SuperSeppel13

Gast
Ich bin bei einer Schulaufgabe auf folgendes Problem gestoßen, bei dem mir bis jetzt
weder eigene Überlegungen noch Google weiter helfen konnten:

Ich habe ein JFrame erstellt, das mir ein relativ grobes Raster auf ein als Zeichenfläche vorgesehenes JPanel zeichnet. Auf diese zeichenfläche kann man mit je zwei Mausklicks eine Linie zeichnen lassen, wobei jedes Kästchen des Rasters einem Pixel entspricht.
(Ziel der Arbeit ist es, anschaulich zu machen, wie der Computer Linien und Kreise zeichnet.)

Zusätzlich kann man mittels eines Schiebereglers die Größe der "Pixel", also die dichte des Rasters verändern.
Soweit funktioniert alles bestens.

Nun möchte ich aber, dass die gezeichneten Linien nach der Veränderung des Rasters neu gezeichnet werden, und dann entsprechend gröber oder feiner aufgelöst sind.
Ich habe zum zeichnen des Rasters die "paintComponent"-Methode meiner von JPanel abgeleiteten Klasse "DrawingPanel" überschrieben. Diese löscht bei jedem Aufruf den gesamten Inhalt des Panels und zeichnet das Raster neu. Aufgerufen wird sie bei jeder Veränderung des Schiebereglers. Jetzt habe ich diese Methode noch um 2 Zeilen erweitert, damit am Ende noch die vorher vorhandenen Linien wieder neu gezeichnet werden. Die Methode sieht nun folgendermaßen aus:


Code:
protected void paintComponent(Graphics g){

        g.clearRect(0, 0, this.getWidth(), this.getHeight()); //löscht die Zeichenfläche

        //grid________________________

        int x = 0;
        int y = 0;

        g.setColor(new Color(gridColor, gridColor, gridColor)); //für das Problem irrelevant

           //hier wird das Raster gezeichnet
        while(x <= this.getWidth()){
            g.drawLine(x, 0, x, this.getHeight());
            x += pixelSize;
        }
        while(y <= this.getHeight()){
            g.drawLine(0, y, this.getWidth(), y);
            y += pixelSize;
        }

        //lines_____________________

        for(int i=0; i<lines.size(); i++){       //hier sollen die Linien gezeichnet werden
            drawLine(lines.get(i)[0], lines.get(i)[1], false);    //"drawLine" ist hier meine eigene Methode

                // "lines" ist eine ArrayList, in der die Endpunkte der Geraden gespeichert sind (als Point[])

        }
    }

Wenn ich diese Methode jetzt aufrufe, wird zwar das Raster korrekt gezeichnet, die Linien verschwinden aber.
Ab und an kann man sie zwar kurz aufblitzen sehen (während des Zeichnens), sie bleiben aber nie sichtbar.
Da auch die letzten beiden Zeilen definitiv ausgeführt werden, bleibt mir nur der Schluss, dass die Methoden nicht nach der Reihe ausgeführt werden. Offensichtlich werden erst die Linien gezeichnet, dann der Bereich gelöscht und anschließend das Ratser gezeichnet. :bahnhof:

Ich habe es auch schon mit Thread-Synchronisation per "synchronized" versucht (obwohl ich davon nichts verstehe :roll: ), habe jedoch nichts erreicht.

Wie kann ich also Java dazu bringen die Methoden von oben nach unten abzuarbeiten, sodass meine Linien wieder auftauchen? [/code]
 

Noctarius

Top Contributor
vermutlich ist das dein Problem
Code:
g.clearRect(0, 0, this.getWidth(), this.getHeight()); //löscht die Zeichenfläche

Das Zeichnen dauert ja einen Moment und so flackert das Raster.

Versuche mal auf einem zweiten Surface das Raster zu zeichnen und dann direkt in einem Schwung rüberblitten auf das sichtbare Frame. Dann sollte es nicht so extrem auffallen.

Google Stichworte: offscreen surface jframe
 
S

SuperSeppel13

Gast
Danke für die schnelle Antwort, aber das Flackern ist nicht mein Problem. Mein Problem ist vielmehr, dass nach dem Ändern des Rasters die Linien nicht zu sehen sind, obwohl ich sie doch zeichne.
Beim Zeichnen des Rasters (ohne Linien) flackert übrigens nichts.
Nur wenn Linien gezeichnet werden sollten, blitzen diese manchmal auf (was bedeutet, dass die Linien gezeichnet werden), bleiben aber nicht da.
 
G

Gast

Gast
Ich mutmaße, dass es sich dabei um ein ständiges repaint-Problem handelt. Hast du mal im Debug-Modus geschaut, ob er evtl. "sehr oft" in die paintComponent springt? Bzw. was macht deine eigene drawLine Methode? Wo hat sie denn eine Referenz zum Graphics objekt, damit sie malen kann?
 
S

SuperSeppel13

Gast
Es stimmt, dass sehr oft ein repaint ausgeführt wird, solange ich den Schieberegler bewege, aber theoretisch sollten die Linien ja bei jedem repaint auch neu gezeichnet werden.

Meine drawLine-Methode zeichnet lediglich eine Linie zwischen den beiden angegebenen Punkten, wobei jedoch ein Pixel jeweils einem Kästchen im Raster entspricht.
Der dritte parameter gibt an, ob die Linie so schnell wie möglich oder langsam Pixel für Pixel gezeichnet werden soll. (Zu Anschauungszwecken soll dies in bestimmten Fällen geschehen, hier jedoch nicht)
Das Graphics-Object hole ich mir innerhalb meiner drawLine-Methode mit this.getGraphics, womit ich meines Wissens das selbe Graphics Object verwende, wie in paintComponent, da ein Objekt doch immer nur eines hat (oder?).
 

Ariol

Top Contributor
.getGraphics() ist nicht gut.
Wenn es unbedingt deine eigene Methode sein muss würde ich Graphics als Parameter mitgeben, aber warum benutzt du nicht die Standard-drawline-Methode?

Code:
drawLine(lines.get(i)[0].x,lines.get(i)[0].y, lines.get(i)[1].x,lines.get(i)[1].y);

Wofür steht das "false" bei deiner Methode?

Und was passiert wenn du das clearRect einfach mal auskommentierst?
 
S

SuperSeppel13

Gast
Die neue drawLine-Methode brauche ich, weil es in der Arbeit darum geht, darzustellen, wie ein Computer eine Linie zeichnet (da er ja nur einzelne Pixel setzen kann). Die Methode zeichnet dann "größere Pixel", die man besser sehen kann.
Wozu der dritte Parameter der Methode - das "false" - steht, hatte ich schon erklärt.

Ich habe nun die Methode dahingehend verändert, dass ich ihr das Graphics-Objekt als weiteren Parameter mitgebe. DADURCH HAT SICH DAS PROBLEM GELÖST (vielen Dank soweit!), es stellt sich mir jedoch die Frage, warum. Was ist der Unterschied?
 

Marco13

Top Contributor
Das mit getGraphics wird immer wieder gemacht, und war schon häufiger Thema hier im Forum. Der Unterschied ist - vereinfacht gesagt - dass NUR das Graphics-Objekt, das der paintComponent übergeben wird, garantiert immer "gültig" ist. Ganz grob (nur zur Verdeutlichung!!!) als Beispiel: Wenn man getGraphics auf einem Panel aufruft, das gerade garnicht sichtbar ist, könnte da "null" zurückgegeben werden. Swing nimmt einem viel Arbeit ab (double-buffering, einfaches repainten im richtigen Thread zum richtigen Zeitpunkt usw). Wenn man ihm abnötigt, sich ein Graphics-Objekt aus den Fingern zu saugen, kann's ein kleines Durcheinander geben....
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
T User input in Verbindung mit ChronoUnit anpassen und falls falsche Eingabe getätigtwird Java Basics - Anfänger-Themen 7
B Binärzahlen auflisten, falsche Ausgabe? Java Basics - Anfänger-Themen 1
Z Java ArrayList speichert falsche Daten ab bzw. gibt falsche Daten aus? Java Basics - Anfänger-Themen 42
volcanos HashSet und Iterator -> Falsche Sortierreihenfolge ? Java Basics - Anfänger-Themen 18
O Falsche Antworten zu Fragen Java Basics - Anfänger-Themen 4
B Compiler-Fehler Fehlermeldung Exception in thread, falsche Eingabewert Java Basics - Anfänger-Themen 2
D falsche eingabe erkennen Java Basics - Anfänger-Themen 2
F Wieso wird immer die falsche Mausposition angegeben? Java Basics - Anfänger-Themen 1
JaVaN0oB Wörterraten - Falsche Ausgabe, String/Chars vergleichen Java Basics - Anfänger-Themen 2
H Falsche Ausgabe Java Basics - Anfänger-Themen 2
K falsche Eingabe abfangen Java Basics - Anfänger-Themen 8
L Falsche Methode wird geladen Java Basics - Anfänger-Themen 2
T JLabel hat falsche größe Java Basics - Anfänger-Themen 1
H Swing Button hat falsche Größe Java Basics - Anfänger-Themen 5
T Input/Output Falsche Eingabe ausgeben Java Basics - Anfänger-Themen 3
R StringBounds falsche Ergebnisse Java Basics - Anfänger-Themen 5
D Falsche Zeile wird in JTable gelöscht Java Basics - Anfänger-Themen 6
W Array in String und String in Array - falsche Ausgaben Java Basics - Anfänger-Themen 20
T Falsche Ausgabe ???? Java Basics - Anfänger-Themen 13
S Falsche Ausgabe Java Basics - Anfänger-Themen 6
M Input/Output ISBN Leser - falsche Eingabe ausgeben Java Basics - Anfänger-Themen 2
V Personenverwaltung mit List<>, falsche Ausgaben Java Basics - Anfänger-Themen 5
R Methoden Switch wählt das Falsche Java Basics - Anfänger-Themen 17
K Falsche Methode Java Basics - Anfänger-Themen 3
J Falsche Darstellung von Float Java Basics - Anfänger-Themen 2
M Falsche Eingabe wiederholen lassen Java Basics - Anfänger-Themen 2
W Methoden Falsche Felder von Methode belgegt Java Basics - Anfänger-Themen 14
M falsche implementierung von currentTimeMillis() ? Java Basics - Anfänger-Themen 14
F charAt-Methode liefert falsche Unicode-Werte Java Basics - Anfänger-Themen 8
P Falsche Werte bei Zeitmessungen Java Basics - Anfänger-Themen 7
Helgon Falsche Zeichen im Text Java Basics - Anfänger-Themen 10
S Parameterübergabe - identische Funktionen, aber falsche Funktion Java Basics - Anfänger-Themen 5
G Bubblesort - Falsche Sortierung Java Basics - Anfänger-Themen 6
D Kriege falsche MD5 Java Basics - Anfänger-Themen 12
R run ->eclipse ruft falsche Programme auf Java Basics - Anfänger-Themen 5
D p q formel gibt zum Teil falsche Werte aus Java Basics - Anfänger-Themen 5
S Falsche Version? Java Basics - Anfänger-Themen 2
C Falsche Zeit Java Basics - Anfänger-Themen 2
V Falsche Augabe Java Basics - Anfänger-Themen 16
C Klammern einlesen!!! Falsche Ausgabe!!!! Java Basics - Anfänger-Themen 4
H Falsche Eingabe über try-catch abfangen Java Basics - Anfänger-Themen 2
K Verschiebeoperatoren - manchmal falsche Ergebnisse Java Basics - Anfänger-Themen 7
L Datenbankanbindung ODBC falsche pfadangabe? Java Basics - Anfänger-Themen 3
O Falsche Bed. (ein überlauf) seh den Fehler aber nicht. Java Basics - Anfänger-Themen 3
G static array liefert falsche Werte zurück Java Basics - Anfänger-Themen 2
S Falsche Ausgabe Java Basics - Anfänger-Themen 3
L Wegen TableSorter wird falsche Zeile einer Tabelle gelöscht? Java Basics - Anfänger-Themen 2
G falsche Version Java Basics - Anfänger-Themen 3
L Falsche Umsetzung von MVC, brauche Hilfe Java Basics - Anfänger-Themen 6
D Tabelle -> Daten eingeben -> Falsche erhalten Java Basics - Anfänger-Themen 9
S Falsche Ausgabe? Java Basics - Anfänger-Themen 2
F Falsche Daten aus Datei Java Basics - Anfänger-Themen 2
G Falsche Java befehle, doch was ist falsch? Java Basics - Anfänger-Themen 9
C falsche Eingabe abfangen Java Basics - Anfänger-Themen 8
M Falsche do-Schleife? Java Basics - Anfänger-Themen 4
E falsche Ausgabe Java Basics - Anfänger-Themen 7
D Falsche Datumsausgabe? Java Basics - Anfänger-Themen 5
J erhalte falsche Kalenderwoche - wo ist der Fehler? Java Basics - Anfänger-Themen 2
Thomas Uppe 2D Array Reihenfolge vermischen Java Basics - Anfänger-Themen 4
E Reihenfolge der Werte umdrehen (mittels statischem int-Array Java Basics - Anfänger-Themen 3
D Methode: Array Reihenfolge tauschen Java Basics - Anfänger-Themen 3
L Hilfe! Liste mit Items werden ausgegeben aber nicht in zufälliger Reihenfolge Java Basics - Anfänger-Themen 6
J Methoden Die Reihenfolge der Iterator-Elemente umkehren Java Basics - Anfänger-Themen 3
R While-Loop der die Einträge eines Arrays in umgekehrter Reihenfolge anzeigt Java Basics - Anfänger-Themen 3
D Array Elemente sortieren in aufsteigender Reihenfolge Java Basics - Anfänger-Themen 10
D Methoden nach einer bestimmten Reihenfolge ausführen. Java Basics - Anfänger-Themen 20
I Array in umgekehrter Reihenfolge - Erklärung - Java Basics - Anfänger-Themen 3
R Werte und Reihenfolge in 2d Arrays vergleichen Java Basics - Anfänger-Themen 5
Q Besitzen zwei Strings identische Buchstaben, nur in anderer Reihenfolge? Java Basics - Anfänger-Themen 10
M Feste Reihenfolge von dem Ablauf von Methoden Java Basics - Anfänger-Themen 7
H Knoten-Reihenfolge einer LinkedList invertieren Java Basics - Anfänger-Themen 11
L Richtige Reihenfolge der Dateien Java Basics - Anfänger-Themen 5
C Werte im Vector in zufällige Reihenfolge bringen Java Basics - Anfänger-Themen 14
C Vector-Inhalt in zufällige Reihenfolge bringen Java Basics - Anfänger-Themen 6
A String in umgekehrter Reihenfolge ausgeben Java Basics - Anfänger-Themen 7
L Reihenfolge Ausgabe Java Basics - Anfänger-Themen 5
J Algorithmus - Strings auf eigene Reihenfolge miteinander vergleichen Java Basics - Anfänger-Themen 4
D TAB Reihenfolge im JSinner Java Basics - Anfänger-Themen 1
RowdyN Methoden Befehle in zufälliger Reihenfolge ausführen lassen Java Basics - Anfänger-Themen 5
B Arrays in Reihenfolge vertauschen Java Basics - Anfänger-Themen 6
J Reihenfolge im Vector lässt sich nicht drehen Java Basics - Anfänger-Themen 9
M Array Reihenfolge umdrehen Java Basics - Anfänger-Themen 9
J Klassen Reihenfolge beim Aufruf von Klassen Java Basics - Anfänger-Themen 1
L zweidimensionales char array reihenfolge ändern ? Java Basics - Anfänger-Themen 2
S Warum muss ich die operationen mit AffineTransform in umgekehrter Reihenfolge ausfuehren..? Java Basics - Anfänger-Themen 4
M Reihenfolge von Testmethoden in JUnit beeinflussen Java Basics - Anfänger-Themen 2
M Ausgabe in falscher Reihenfolge Java Basics - Anfänger-Themen 7
S Vokal Reihenfolge Java Basics - Anfänger-Themen 1
C if Reihenfolge Java Basics - Anfänger-Themen 2
W String von hinten alle drei Zeichen abschneiden und in umgekehrter Reihenfolge ausgeben. Java Basics - Anfänger-Themen 9
F Reihenfolge des Quelltexts Java Basics - Anfänger-Themen 6
S Jede Reihenfolge einer zufällig langen Liste ausprobieren Java Basics - Anfänger-Themen 3
B AffineTransform - Reihenfolge der Operationen Java Basics - Anfänger-Themen 3
B Methoden Logische Reihenfolge in Programmen? Java Basics - Anfänger-Themen 4
D Problem mit Initialisierung und Reihenfolge Java Basics - Anfänger-Themen 10
O Zwingende Reihenfolge von Methoden Java Basics - Anfänger-Themen 33
P Vereinfachte for-Schleife wird in umgekehrter Reihenfolge ausgewertet Java Basics - Anfänger-Themen 7
X Collections Reihenfolge bestimmter Objekte in einer ArrayList verändern Java Basics - Anfänger-Themen 2
S Buttons übereinander legen - Reihenfolge Java Basics - Anfänger-Themen 2
G Zahlen in zufälliger Reihenfolge ausgeben/speichern. Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben