Problem: repaint() - Schleife

abcde

Neues Mitglied
Hallo liebe Community,

ich habe mich hier angemeldet, weil ich ein Problem mit einem Programm habe:

Es wird die Mandelbrotmenge gezeichnet, dazu wird ein Iterationsvorgang verwendet, mit dem eine Reihe Zahlen überprüft wird. Je nach Ergebnis soll ein Punkt im JPanel gezeichnet werden. Mein Problem ist, dass der repaint()-Aufruf zu oft hintereinander aufgerufen wird, und so nicht jeder Punkt gezeichnet wird.
Deshalb habe ich die entsprechende Methode mit Thread.sleep(10); "ausgebremst".
Zufrieden bin ich mit dieser Lösung nicht, und würde mich über Hilfe freuen :)

Hier der Code:

Klasse Frame2
Java:
import java.awt.*;
import java.awt.geom.*;
import javax.swing.*;
import java.awt.event.*;
import java.lang.Math.*;

public class Frame2 extends Thread{

    JFrame fenster;
    Menge menge;

    /**
     * Konstruktor
     */
    public Frame2 (){

        fenster = new JFrame ("Mandelbrotmenge");
        fenster.setBackground(Color.white);

        menge = new Menge();
        fenster.add(menge);

        //menueErzeugen();
        fenster.setSize(600,600);
        fenster.setVisible(true);
    }

    /**
     * Mit dieser Methode wird mittels der beiden for-Schleifen eine Reihe komplexer Zahlen in Schritten von 0.01 durchgegangen.
     * Dies wird mit den Zählvariablen t(Realteil) und u (Imaginärteil) umgesetzt, die dann der iterieren(..)-Methode zur Prüfung übergeben werden.
     * 
     */   
    public void punkteEinfuegen (){
        //fuer die Addition komplexer Zahlen gilt: c + w = (a,ib)+(c,id)=(a+c,ib+id);
        //fuer die Multiplikation komplexer Zahlen gilt: c+w = (a,b)*(c,d) = (a*c-ib*id,a*id+ib*c);
        //Zählvariablen 
        double t =-2.00;    //Real
        double u = -1.00;   //Imag
        //Schleifen zum durchgang aller Zahlen im Bereich von re=[-2;1] und im = [-1i;1i]
        for (int re = -200; re < 100; re++){    
            u= -1.00;   
            for(int im= -100; im < 100; im++) {
                
                    switch(iterieren(t,u)){     //Der Methode iterieren(...) wird Real- und Imaginärteil übergeben; je nach erhaltenen Rückgabewert soll eine Aktion ausgewählt werden:
                        case 1: menge.punktEinfuegen(t,u,Color.blue); // Falls 1 zurückgegeben wird, ist die Zahl ein Element der Mandelbrotmenge, und kann somit blau gezeichnet werden.
                        break;
                        case 2: menge.punktEinfuegen(t,u,Color.pink); // Für jede Zahl >1 liegt die Zahl nicht in der Mandelbrotmenge und kann somit in einer anderen Farbe gezeichnet werden.
                        break;                                                      //  |
                        case 3: menge.punktEinfuegen(t,u,Color.magenta);            //  |    Farbabstufungen
                        break;                                                      //  \/
                        case 4: menge.punktEinfuegen(t,u,Color.red);
                        break;
                        case 5: menge.punktEinfuegen(t,u,Color.orange);
                        break;
                        case 6: menge.punktEinfuegen(t,u,Color.yellow);
                        break;
                    }
                    try{                                    // Das ist meine primitiv-Lösung damit alle Punkte auch angezeigt werden. Durch die 10-millisekündliche Pausierung 
                        Thread.sleep(10);                   // ist die Bildschirmausgabe größtenteils fehlerfrei. Allerdings verlangsamt sich das Programm dadurch sehr.
                    }catch (InterruptedException e) {}      // Für eine andere Lösung wäre ich sehr dankbar.
                    u = u + 0.01;
                
            }
            t = t +0.01;   
        }

    }

    /**
     * Diese Mehthode prüft eine übergebene Zahl (Realteil und Imaginärteil), ob sie Element der Mandelbrotmenge ist. 
     * Dies wird mit den Zählvariablen t und u umgesetzt.
     * 
     * @param  cre Realteil einer mit der Iterationsformel zu prüfenden Zahl 
     * @param  cim Imaginärteil einer mit der Iterationsformel zu prüfenden Zahl
     * @return     1 falls die übergebene Zahl (cre,cim) Element der Mandelbrotmenge ist; eine Zahl größer eins wenn die Zahl kein Element der Mandelbrotmenge ist. 
     */   
    private int iterieren(double cre, double cim){
        double zre = 0;     // zre und zim wird für die Iterationsvorschrift benötigt (Zahl Z auf dem Skript)
        double zim = 0;
        int iteration = 0;  // Die Variable der for-Schleife wird hier bereits angelegt, um den Gültigkeitsbereich dieser auf die ganze Methode zu erweitern.
        double betrag = 10; // Hier wird der Betrag von Z nach jedem Schleifendruchlauf gespeichert. Aus vorher genanntem Grund wird diese ebenfalls hier angelegt.
        // Die Zahl 10 ist beispielhaft gewählt (größer als zwei), falls in der for-Schleife betrag nicht überschrieben werden sollte, muss dennoch ein Wert vor-
        // handen sein.
        for(iteration = 0; iteration<25; iteration++){       
            double temp = zre;
            // zum Rechnen mit komplexen Zahlen werden diese immer als Paar zweier Zahlen getrennt gespeichert, so auch hier:
            // Formel: 
            zre = (zre*zre-zim*zim)+ (cre);
            zim = (2*zim*temp)+(cim);

            // Nach jedem Durchlauf soll noch geprüft werden, ob der Iterationsvorgang nicht schon früher abgebrochen werden kann. Dazu wird der Betrag der Zahl Z = (zre,zim)
            // berechnet.
            betrag = Math.sqrt((zre*zre) + (zim*zim));
            //Uebersteigt der Betrag von Z den Wert 2, so kann laut Skript abgebrochen werden
            if(betrag>=2){
                break;

            }
        }    
        if(iteration == 25 && betrag <2){
            return 1;       // ist nach 25 Iterationsvorgängen noch nicht abgeborchen worden (also betrag <2), so wird 1 zurückgegeben.
        } else {
            switch (iteration) { 
                case 24: return 2;          // Bei den sonstigen Fällen wird eine Zahl größer 1 zurückgegeben. Die Staffelung hier ist beliebig gewählt und dient zur Darstellung
                // mit verschiedenen Farben.
                case 23: return 2;

                case 22: return 2;

                case 21: return 2;

                case 20: return 2;

                case 19: return 3;

                case 18: return 3;

                case 17: return 3;

                case 16: return 3;

                case 15: return 3;

                case 14: return 4;

                case 13: return 4;

                case 12: return 4;

                case 11: return 4;

                case 10: return 4;

                case 9: return 5;

                case 8: return 5;

                case 7: return 5;

                case 6: return 5;

                case 5: return 5;

                case 4: return 6;

                case 3: return 6;

                case 2: return 6;

                case 1: return 6;

                case 0: return 6;
            }

        }
        return 6; // falls ein oben genannter Fall in der if-Abfrage/switch-Anweisung nicht eintritt
    }

}

und hier noch der Code der Klasse MENGE:

Java:
import java.awt.*;
import javax.swing.*;
import java.awt.geom.*;

public class Menge extends JPanel {
    
    private int x;
    private int y;
    private Color farbe;
    
    /**
     * Konstruktor
     */
    public Menge(){
        x = 0;
        y = 0;
        farbe = Color.black; // wird hier schwarz gesetzt, da unten in paint(Graphics g) bereits ein Punkt in (0|0) gezeichnet wird.

    }
    
    /**
     * Diese Mehthode fügt eine Zahl(Realteil und Imaginärteil) als farbigen Punkt ein. Die anzugebenden Koordinaten sind die, die im gezeichneten KOSY angezeigt werden.
     * Diese Koordinaten werden von dieser Methode in jene umgerechnet, die das Java-KOSY benötigt (siehe unten).
     * 
     * @param  x   Realteil einer Zahl 
     * @param  y   Imaginärteil einer Zahl
     * @param  farbe Farbe des Punktes, der gezeichnet werden soll.
     */   
    public void punktEinfuegen(double x, double y, Color farbe) {
        //Umrechen der üblichen Koordinaten in diejenigen, die zur Darstellung benötigt werden (Ursprung KOSY (340|280); 1 LE im KOSY sind 100 LE in Java)
        this.x = (int) (340 + x*100); // 100  entspr. 1 LE, deswegen x*100; bei 340 ist x = 0, also +340
        this.y = (int) (280 - y*100); // 100  entspr. 1 LE, deswegen y*100; bei 280 ist y = 0, aber diese wird nach unten hin größer, also -240            
        this.farbe = farbe;
        repaint();
    }
    
    
    /**
     * Diese Mehthode zeichnet KOSY-Achsen (inkl. Beschriftungen), sowie einen Punkt mit den Koordinaten (x|y).
     * 
     */   
    public void paint (Graphics g) {
        Graphics2D g2d = (Graphics2D) g;
        //Farbe
        g2d.setColor(Color.black);  
        //Achsen
        g2d.drawLine(340,0,340,600);
        g2d.drawLine(0,280,600,280);
        //KOSY Ursprung: (340|280)
        //Re-Achse Zahlen
        g2d.drawLine(440,275,440,285);
        g2d.drawString("1",440,300);
        
        g2d.drawLine(240,275,240,285);
        g2d.drawString("-1",240,300);
        
        g2d.drawLine(140,275,140,285);
        g2d.drawString("-2",140,300);
        
        //Pfeilspitze und Achsenbeschriftung
        g2d.drawLine(545,275,550,280);
        g2d.drawLine(545,285,550,280);
        g2d.drawString("Re",560,300);
        
        g2d.drawLine(335,5,340,0);
        g2d.drawLine(345,5,340,0);
        g2d.drawString("Im",350,15);
        
        //Im-Achse Zahlen
        g2d.drawLine(335,180,345,180);
        g2d.drawString("1i",350,190);
        
        g2d.drawLine(335,380,345,380);
        g2d.drawString("-1i",350,390);
        
        // Zeichnet Punkt. Wird benötigt, um die einzelnen Punkte der Mandelbrotmenge einzuzeichnen.
        g2d.setColor(farbe);
        g2d.drawLine(x,y,x,y);
        
    }
    
}

Die iterieren(..)-Methode dient nur zur Vollständigkeit.

Wie könnte man das Darstellungsproblem aller Punkte auf dem Bildschirm lösen?
Ich sage schon mal vielen Dank :)
 

Major_Sauce

Bekanntes Mitglied
Hallo :)

Neu in Java ?
Was genau du mit "Punkte" und mit "Mandelbrotmenge" meinst konnte ich aus dem Kontext jetzt nicht direkt rauslesen.

Von wo wird denn die Methode punktEinfügen() ausgeführt ?
Generell verwendet man bei graphischen Anwendungen meißt render und update-Loops, die dann erst ein Update ausführen und dann rendern.
Diese werden immer verwendet es sei denn es verändert sich nicht viel. Sollte zum Beispiel nur ein Click-Counter gerendert werden macht es natürlich nur Sinn zu repainten wenn ich auch wirklich geklickt habe.

Ganz generell sage ich mal :
Für einfache Anwendungen sollte das Thread.sleep(10) normalerweise reichen.
Komplexere Repaint-Schleifen werden erst benötigt wenn die Repaint-Zeit jedes mal mehr oder weniger 100 % stimmen soll.
Aber mal so ne Frage :
1. Gibt es einen Grund warum die Frame2.class von einen Thread erbt ?

mfg Major_Sauce
 

Gucky

Top Contributor
Da hat Major_Sauce recht. Threads können nested classes sein, lokale Runnables oder separate Klassen aber eine GUI Klasse sollte nicht von Thread erben.
Außerdem hast du implements Runnable vergessen. Threads führen immer public void run aus. Fehlt dies, kann ein Thread nichts ausführen.
 

abcde

Neues Mitglied
Ja ich bin neu in Java, zumindest was etwas fortgeschrittene Aufgaben betrifft.
Es kann durchaus sein, dass einzelne Aufrufe nicht gebraucht werden, ich habe schon sehr viel ausprobiert und vll. sind das Überreste von irgendwelchen Ausprobierereien ;)
Mit Punkte meine ich die Linien, die in der paint(..)-Methode der Klasse MENGE mit dem letzten Befehl gezeichnet werden sollen.

Die Methode punktEinfuegen(...) in der Klasse MENGE wird in der Methode punkteEinfuegen() der Klasse FRAME2 aufgerufen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Swing Repaint Problem - mal wieder AWT, Swing, JavaFX & SWT 5
Ernesto95 AnimationLoop - Problem bei Aufruf von repaint AWT, Swing, JavaFX & SWT 6
P EDT Problem? Kein Aufruf der repaint Methode AWT, Swing, JavaFX & SWT 6
kodela Problem mit repaint() AWT, Swing, JavaFX & SWT 3
H repaint()-Problem - 50% CPU-Auslastung AWT, Swing, JavaFX & SWT 4
T repaint() Problem AWT, Swing, JavaFX & SWT 2
K Jpanel repaint problem (Fullscreen) AWT, Swing, JavaFX & SWT 5
E AWT Problem mit Repaint (in Loop oder Timer) AWT, Swing, JavaFX & SWT 3
J Swing Verständnis-Problem repaint(int x,int y,int width,int height) AWT, Swing, JavaFX & SWT 3
J [gelöst] repaint problem AWT, Swing, JavaFX & SWT 2
M problem mit repaint()-Methode[gelöst] AWT, Swing, JavaFX & SWT 8
G problem mit threads/repaint ! AWT, Swing, JavaFX & SWT 2
D Problem mit Netbeans und repaint() AWT, Swing, JavaFX & SWT 5
E Problem mit repaint() AWT, Swing, JavaFX & SWT 11
K Problem mit JLabel, Rechteck, repaint() ;) AWT, Swing, JavaFX & SWT 2
K Problem repaint()->paintComponent AWT, Swing, JavaFX & SWT 9
M Problem bei Repaint von Panels AWT, Swing, JavaFX & SWT 2
L Swing repaint problem AWT, Swing, JavaFX & SWT 7
B Problem bei repaint AWT, Swing, JavaFX & SWT 5
V repaint problem AWT, Swing, JavaFX & SWT 12
A Repaint-Problem AWT, Swing, JavaFX & SWT 4
S repaint()-Problem AWT, Swing, JavaFX & SWT 6
S Repaint()-Problem im GBL? AWT, Swing, JavaFX & SWT 5
S paint/repaint problem mit awt/swing? AWT, Swing, JavaFX & SWT 2
L repaint()-Problem AWT, Swing, JavaFX & SWT 18
G Problem mit der Anzeige von jLabel. Unlesbar wenn der Text geändert wird. AWT, Swing, JavaFX & SWT 28
H 2D-Grafik Problem mit Paint AWT, Swing, JavaFX & SWT 1
S Layout - Problem AWT, Swing, JavaFX & SWT 1
Tassos JavaFX/Problem mit der Maussteuerung in Stackpane AWT, Swing, JavaFX & SWT 7
sserio Java Fx - Problem AWT, Swing, JavaFX & SWT 3
A Problem Spiel auf Panel der GUI zu bringen AWT, Swing, JavaFX & SWT 1
A JavaFX Controller Problem AWT, Swing, JavaFX & SWT 1
TheWhiteShadow JavaFX ListView Problem beim Entfernen von Elementen AWT, Swing, JavaFX & SWT 1
E LayoutManager Welcher Layout-Mix löst mein Problem? AWT, Swing, JavaFX & SWT 3
Umb3rus JavaFX Problem mit PropertyValueFactory: can not read from unreadable property AWT, Swing, JavaFX & SWT 1
T Problem mit paintComponent() AWT, Swing, JavaFX & SWT 17
AmsananKING Java Menü-Problem AWT, Swing, JavaFX & SWT 1
K JavaFX Resizing-Problem beim BorderLayout (Center Component) beim Arbeiten mit mehreren FXMLs AWT, Swing, JavaFX & SWT 2
G Instance OF Problem AWT, Swing, JavaFX & SWT 9
FrittenFritze Ein Problem mit der CSSBox, die Größe wird nicht angepasst AWT, Swing, JavaFX & SWT 5
M Problem mit dem Anzeigen von Frames im Vordergrund AWT, Swing, JavaFX & SWT 5
Badebay Problem mit JButton AWT, Swing, JavaFX & SWT 2
newJavaGeek Grid-Layout problem AWT, Swing, JavaFX & SWT 7
J JavaFX Löschen im Tabelview macht Problem AWT, Swing, JavaFX & SWT 15
JavaTalksToMe JavaFx ExekutorService Problem AWT, Swing, JavaFX & SWT 2
Zrebna Problem bei Eventhandling (Value soll nach jedem erneutem Klick gelöscht werden) AWT, Swing, JavaFX & SWT 4
B Problem mit JavaFX AWT, Swing, JavaFX & SWT 5
J css Problem AWT, Swing, JavaFX & SWT 5
B JavaFX habe mein Problem fett markiert AWT, Swing, JavaFX & SWT 2
A Swing Filter-Problem AWT, Swing, JavaFX & SWT 1
temi JavaFX Problem mit IntelliJ und JavaFx 11 unter XUbuntu AWT, Swing, JavaFX & SWT 3
L Java FX Problem mit Ubuntu 18 und JavaFx AWT, Swing, JavaFX & SWT 27
H JTable TableCellEditor-Problem AWT, Swing, JavaFX & SWT 0
kodela Swing Problem mit Warten-Dialog AWT, Swing, JavaFX & SWT 16
B JavaFx Scene Builder Problem AWT, Swing, JavaFX & SWT 2
B [Problem] Java öffnet Word-Datein nicht AWT, Swing, JavaFX & SWT 14
T DataBinding Problem AWT, Swing, JavaFX & SWT 5
Blender3D Problem mit € Symbol Font Gotham Windows 10 Swing AWT, Swing, JavaFX & SWT 11
T Problem mit JTable Sortierung AWT, Swing, JavaFX & SWT 2
J Problem mit Platfrom run later AWT, Swing, JavaFX & SWT 15
J Problem mit Platfrom run later AWT, Swing, JavaFX & SWT 0
D Swing SwingUtils / Thread Problem AWT, Swing, JavaFX & SWT 3
L JavaFX Problem beim Aufrufen einer Methode AWT, Swing, JavaFX & SWT 5
T Swing Problem mit Datum und FormattedTextField AWT, Swing, JavaFX & SWT 2
S AWT Java print dialog Problem AWT, Swing, JavaFX & SWT 0
olfibits JavaFX Problem mit HTMLEditor AWT, Swing, JavaFX & SWT 0
W SWT hover-background-problem with first column in TreeViewer AWT, Swing, JavaFX & SWT 0
M Problem mit Add JScrollPane AWT, Swing, JavaFX & SWT 25
Mario1409 Swing JTextArea scroll Problem AWT, Swing, JavaFX & SWT 0
N Swing Problem mit loop AWT, Swing, JavaFX & SWT 2
S Swing Problem mit Button und ActionListener AWT, Swing, JavaFX & SWT 5
S Swing & Clean und build Problem AWT, Swing, JavaFX & SWT 12
S JLabel setText() Problem AWT, Swing, JavaFX & SWT 6
I 2D-Grafik Problem beim Ändern der Farbe eine 2d Objekts AWT, Swing, JavaFX & SWT 3
G Swing Splitpane Problem AWT, Swing, JavaFX & SWT 1
F Problem mit der FXML Rectangle Shape AWT, Swing, JavaFX & SWT 2
N JavaFX Stranges Problem mit der Autoscroll-Eigenschaft von Textareas AWT, Swing, JavaFX & SWT 0
E Java FX FXML Problem mit html Scriptausführung AWT, Swing, JavaFX & SWT 2
J JavaFX Intersect Problem mit Shapes AWT, Swing, JavaFX & SWT 10
R JavaFX MediaPlayer AVI-Problem AWT, Swing, JavaFX & SWT 1
M Swing Problem mit ListCellRenderer AWT, Swing, JavaFX & SWT 7
D Problem mit JTable AWT, Swing, JavaFX & SWT 1
F GUI Auflösung ändern - Koordianten und Proportions Problem AWT, Swing, JavaFX & SWT 21
J Problem mit Button darstellung AWT, Swing, JavaFX & SWT 23
M Problem mit Layoutmanagern... Hilfe wäre sehr nett. AWT, Swing, JavaFX & SWT 2
S 2D-Grafik Problem mit Variablen AWT, Swing, JavaFX & SWT 4
7 JavaFX Problem beim Zeichnen eines Dreiecks in einem GUI AWT, Swing, JavaFX & SWT 6
M Swing AttributiveCellTableModel addRow() Problem AWT, Swing, JavaFX & SWT 1
J Swing Problem mit Graphics Methode AWT, Swing, JavaFX & SWT 4
N JavaFX Problem mit table multiple selection AWT, Swing, JavaFX & SWT 5
K CheckBox Problem AWT, Swing, JavaFX & SWT 5
Grevak DisplayMode Problem seit Windows 10 AWT, Swing, JavaFX & SWT 2
S Swing Eigene JComboBox Problem! AWT, Swing, JavaFX & SWT 1
B Swing Problem mit Bildpfad AWT, Swing, JavaFX & SWT 4
N Swing Problem beim Scrollen mit JScrollPane AWT, Swing, JavaFX & SWT 6
V Graphics g - drawOval problem mit background AWT, Swing, JavaFX & SWT 1
C AWT Problem mit Protokol Fenster AWT, Swing, JavaFX & SWT 0
M Swing pack() Problem mit Taskleiste AWT, Swing, JavaFX & SWT 4
N Swing Choice- Problem! AWT, Swing, JavaFX & SWT 8
Q "AWT-EventQueue-0" Exception Problem AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen

Neue Themen


Oben