K
Kiwiatjava
Gast
Hallo
Es geht zwar um die sleep()-Methode, allerdings brauche ich die, um etwas zu zeichnen, daher hoffe ich, dass ich hier im Grafikabteil richtig bin.
Im Prinzip versuche ich, einen Funktionsplotter zu schreiben. Es soll nun eine Art Pseudo-Animation zu Stande kommen, die die berechneten Punkte einfach nacheinander (wünschenswerter Zeitabstand bspw. 100 ms) zeichnet.
Da das Zeichnen bei mir in einer for-Schleife (bzw. alternativ: For-each-Schleife, s. Kommentar) geschieht, dachte ich mir, dass es das Einfachste wäre, einfach nach jedem Durchgang durch die Schleife, 100 ms mit Thread.sleep(100) zu warten. Pustekuchen, mag einfach nicht - das Fenster bleibt schwarz und es passiert nichts.
Scheitert es daran, dass das mit paint() grundsätzlich nicht funktioniert? Muss ich erst explizit einen neuen Thread erstellen, damit ich ihn schlafen schicken kann oder zählt einfach der Aufruf der main-Methode schon als Thread?
Beim Importieren sind ein paar überflüssige Sachen dabei, muss ich erst noch ausmisten - Entschuldigung hierfür.
Auch ganz allgemein: Entschuldigung für den etwas durchwachsenen Code, ich bin gerade an einer Stelle angekommen, an der ich selber den Überblick etwas verliere. Habe, so weit es mir möglich war, Ordnung geschafft - hoffe das ist erträglich so.
Ich arbeite mit NetBeans unter Windows.
Hoffe sehr, ihr könnt mir weiterhelfen.
Vielen Dank,
Kiwi
Es geht zwar um die sleep()-Methode, allerdings brauche ich die, um etwas zu zeichnen, daher hoffe ich, dass ich hier im Grafikabteil richtig bin.
Im Prinzip versuche ich, einen Funktionsplotter zu schreiben. Es soll nun eine Art Pseudo-Animation zu Stande kommen, die die berechneten Punkte einfach nacheinander (wünschenswerter Zeitabstand bspw. 100 ms) zeichnet.
Da das Zeichnen bei mir in einer for-Schleife (bzw. alternativ: For-each-Schleife, s. Kommentar) geschieht, dachte ich mir, dass es das Einfachste wäre, einfach nach jedem Durchgang durch die Schleife, 100 ms mit Thread.sleep(100) zu warten. Pustekuchen, mag einfach nicht - das Fenster bleibt schwarz und es passiert nichts.
Scheitert es daran, dass das mit paint() grundsätzlich nicht funktioniert? Muss ich erst explizit einen neuen Thread erstellen, damit ich ihn schlafen schicken kann oder zählt einfach der Aufruf der main-Methode schon als Thread?
Beim Importieren sind ein paar überflüssige Sachen dabei, muss ich erst noch ausmisten - Entschuldigung hierfür.
Auch ganz allgemein: Entschuldigung für den etwas durchwachsenen Code, ich bin gerade an einer Stelle angekommen, an der ich selber den Überblick etwas verliere. Habe, so weit es mir möglich war, Ordnung geschafft - hoffe das ist erträglich so.
Ich arbeite mit NetBeans unter Windows.
Hoffe sehr, ihr könnt mir weiterhelfen.
Vielen Dank,
Kiwi
Java:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Point;
import java.util.*;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Graph extends JPanel {
private List<Point> points = new ArrayList<Point>(); //Liste für die Punkte
private int kosys = 500; //Größe des Koordinatensystems in Pixeln
private int rastergroesse = 10;
public static void main(String[] args) {
JFrame f = new JFrame();
f.setLayout(new BorderLayout());
f.add(new Graph());
f.setVisible(true);
f.pack();
}
//Konstruktor
public Graph() {
for (double x = 0; x <= kosys; x = x + 0.01) {
double y = Math.cos(x); //Formel zur Berechnung der y-Werte
//Hier wird ein bisschen hin- und hergerundet, damit das mit den Pixeln hinhaut. Habe ein wenig das Gefühl, ich habe hier bisschen Unnötiges programmiert - ist jetzt allerdings nicht das Thema
int x_neu = (int) (x * 100);
int y_neu = (int) (runden(y, 3) * 1000);
points.add(new Point(x_neu, y_neu));
}
}
// Anfang Methoden
public void paint(Graphics g) {
super.paint(g);
//Koordinatensystem
g.drawLine(0, kosys, kosys * 2, kosys);
g.drawLine(0, 0, 0, kosys * 2);
//Einheiten bzw. Markierungen
for (int i = 0; i < (kosys * 2); i = i + rastergroesse) {
g.drawLine(i + rastergroesse, kosys - 5, i + rastergroesse, kosys + 5); //x-Achse
g.drawLine(-5, i + rastergroesse, 5, i + rastergroesse); //y-Achse
}
g.setColor(Color.RED);
//Um diese For-Schleife geht es !
for (int i = 0; i<points.size(); i++){
g.drawLine(points.get(i).x, kosys-(points.get(i).y), points.get(i).x, kosys-points.get(i).y);
//try {
//Thread.sleep(100);
//}
//catch (InterruptedException e) {
//}
// Schön wär's... Genau das obige mag nicht funktionieren.
}
//evtl. elegantere Variante, die (logischerweise) ebensowenig funktioniert:
// for (Point p : points) {
// g.drawLine(p.x, kosys - (p.y), p.x, kosys - (p.y));
// try {
// Thread.sleep(500);
// }
// catch (InterruptedException e) {
// }
//
//
// }
}
public static double runden(double wert, int stellen) {
double gerundet = Math.round(wert * Math.pow(10d, stellen));
return gerundet / Math.pow(10d, stellen);
}
public Dimension getPreferredSize() {
return this.getMaximumSize();
}
public Dimension getMinimumSize() {
return this.getMaximumSize();
}
public Dimension getMaximumSize() {
return new Dimension(kosys * 2, kosys * 2);
}
// Ende Methoden
}
Zuletzt bearbeitet von einem Moderator: