Guten Tag,
Ich versuche mich seit längerer Zeit wieder etwas mit der GUI-Programmierung. Mit Hilfe dieses Videotutorial versuche ich die Koch-Kurve zu zeichnen.
Ich habe in meinem Programm zwei Panels. Einmal ein Panel "pnlParameter" und das Panel "pnlFraktal". Auf dem pnlParameter befindet sich ein Button "btnIteration" mit dem ich eine neue Iteration zeichnen lassen möchte der Koch-Kurve. Diese wird auf dem pnlFraktal gezeichnet.
Das Problem liegt darin dass beim Klick auf den Button die neuen Iterationen korrekt gezeichnet werden aber die Figur der jeweils vorherigen Iterationen bleibt erhalten.
Hier mein Quellcode:
Kochkurve.java
KochKurveGUI.java
Danke sehr,
Gruß,
Megara
Ich versuche mich seit längerer Zeit wieder etwas mit der GUI-Programmierung. Mit Hilfe dieses Videotutorial versuche ich die Koch-Kurve zu zeichnen.
Ich habe in meinem Programm zwei Panels. Einmal ein Panel "pnlParameter" und das Panel "pnlFraktal". Auf dem pnlParameter befindet sich ein Button "btnIteration" mit dem ich eine neue Iteration zeichnen lassen möchte der Koch-Kurve. Diese wird auf dem pnlFraktal gezeichnet.
Das Problem liegt darin dass beim Klick auf den Button die neuen Iterationen korrekt gezeichnet werden aber die Figur der jeweils vorherigen Iterationen bleibt erhalten.
Hier mein Quellcode:
Kochkurve.java
Java:
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Path2D;
import javax.swing.JPanel;
public class KochKurve extends JPanel {
/**
*
*/
private static final long serialVersionUID = 1516564899406406771L;
private double[] koordX = {100.0, 400.0, 250.0};
private double[] koordY = {50+Math.sqrt(300.0*300.0-150.0*150.0),50+Math.sqrt(300.0*300.0-150.0*150.0), 50.0};
private Path2D kochKurve = new Path2D.Double();
// Konstruktor
public KochKurve(){
setSize(500, 500);
// Hintergrundfarbe festlegen
setBackground(Color.WHITE);
}
public void berechneNeuePunkte(){
double[] neuKoordX = new double[koordX.length * 4];
double[] neuKoordY = new double[koordY.length * 4];
for (int i = 0; i < koordX.length; i++) {
neuKoordX[i * 4] = koordX[i];
neuKoordY[i * 4] = koordY[i];
double dX = koordX[(i + 1) % koordX.length] - koordX[i];
double dY = koordY[(i + 1) % koordX.length] - koordY[i];
neuKoordX[i * 4 + 1] = koordX[i] + dX/3.0;
neuKoordY[i * 4 + 1] = koordY[i] + dY/3.0;
double a = dX / 6.0 - Math.sqrt(3.0) / 6 * dY;
double b = dY / 6.0 + Math.sqrt(3.0) / 6 * dX;
neuKoordX[i * 4 + 2] = neuKoordX[i * 4 + 1] + a;
neuKoordY[i * 4 + 2] = neuKoordY[i * 4 + 1] + b;
neuKoordX[i * 4 + 3] = koordX[i] + 2.0 * dX/3.0;
neuKoordY[i * 4 + 3] = koordY[i] + 2.0 * dY/3.0;
}
koordX = neuKoordX;
koordY = neuKoordY;
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
// g.clearRect(0, 0, getWidth(), getHeight());
// g.setColor(Color.WHITE);
// g.fillRect(0, 0, HEIGHT, WIDTH);
Graphics2D g2 = (Graphics2D) g;
g2.setColor(Color.white);
g2.fillRect(0, 0, WIDTH, HEIGHT);
// g2.setColor(Color.WHITE);
// g2.fill(new Rectangle2D.Double(0.0, 0.0, HEIGHT, WIDTH));
g2.setColor(Color.BLACK);
g2.setStroke(new BasicStroke(0.5F));
kochKurve.moveTo(koordX[0], koordY[0]);
for (int i = 0; i < koordX.length; i++) {
System.out.println(i + " " + koordX[i] + " " + koordY[i]);
kochKurve.lineTo(koordX[i], koordY[i]);
}
kochKurve.closePath();
g2.draw(kochKurve);
berechneNeuePunkte();
}
}
KochKurveGUI.java
Java:
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class KochKurveGUI extends JFrame {
/**
*
*/
private static final long serialVersionUID = 7649804869832316597L;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
KochKurveGUI frame = new KochKurveGUI();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
public KochKurveGUI() {
setResizable(false);
setTitle("Koch-Kurve");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
setSize(800, 500);
getContentPane().setLayout(null);
JPanel pnlParameter = new JPanel();
pnlParameter.setBounds(0, 0, 110, 472);
getContentPane().add(pnlParameter);
pnlParameter.setLayout(null);
final JPanel pnlFraktal = new KochKurve();
pnlFraktal.setBounds(110, 0, 684, 472);
getContentPane().add(pnlFraktal);
JButton btnNeueIteration = new JButton("Iteration");
btnNeueIteration.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
pnlFraktal.repaint();
}
});
btnNeueIteration.setBounds(10, 11, 89, 23);
pnlParameter.add(btnNeueIteration);
}
}
Danke sehr,
Gruß,
Megara