Dobrý den,
potřeboval bych pomoci s objasněním a pokud možno vyřešením problému. Udělal jsem si fraktálový strom a chtěl bych ho rozpohybovat. Udělal jsem si Timer nějakou náhodu aby to simulovalo neurčitost větru a pomalu překresluji obraz. Narazil jsem na problém že repaint již namalované čáry nevymaže ale pouze přikreslí nové tudíž jsem musel po každém vykreslení stromu celou oblast vyplnit bíle a zase nakreslit strom ale zdá se, že je vyplňování strašlivě pomalé a když si program pustím téměř nic nevidím.
Zajímavé ovšem je, že když po okně jezdím myší tak se vše vykresluje krásně a plynule ale nesmím přestat jezdit ... Můžete mi tento problém objasnit a pokud možno navrhnout řešení? zde je zdrojový kód zkuste si ho pustit a řekněte, jeslti vám co také dělá já to testoval na 3 PC a dělá to všude.
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.Timer;
/**
*
* @author kadlejan
*/
public class FractalTree extends JFrame implements ActionListener{
Timer timer;
public double uhel = -90;
public String vyber = "01";
Random r = new Random();
int rychlost = 100;
public FractalTree() {
super("Fraktálový strom");
setBounds(100, 100, 800, 600);
setResizable(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
timer = new Timer(rychlost, this);
timer.setInitialDelay(1000);
timer.start();
}
private void drawTree(Graphics g, int x1, int y1, double uhel, int hloubka) {
if (hloubka == 0) return;
int x2 = x1 + (int) (Math.cos(Math.toRadians(uhel)) * hloubka * 10.0);
int y2 = y1 + (int) (Math.sin(Math.toRadians(uhel)) * hloubka * 10.0);
g.drawLine(x1, y1, x2, y2);
drawTree(g, x2, y2, uhel - 20, hloubka - 1);
drawTree(g, x2, y2, uhel + 20, hloubka - 1);
}
@Override
public void paint(Graphics g) {
g.setColor(Color.white);
g.fillRect(0, 0, 800, 800);
g.setColor(Color.BLACK);
g.drawString("Fraktálový strom", 100, 100);
drawTree(g, 400, 500, uhel, 9);
double nahoda = Math.random();
if (nahoda < 0.2){
uhel = uhel - 0.9;
}
if(nahoda >= 0.2 && nahoda >=0.8){
uhel = uhel;
}
if(nahoda > 0.8){
uhel = uhel +0.9;
}
}
@Override
public void actionPerformed(ActionEvent e) {
repaint();
}
}
Děkuji za pomoc.