我在试着画一棵分形树。
它将绘制树,但我想制作一个动画,这样树就可以从它的“树干”中生长?另外,是否有可能使动画流畅呢?
如果我使用Thread.sleep方法,它会画出非常奇怪的树。
能帮我的人吗?非常感谢
下面是我的代码:
import java.awt.BasicStroke;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import javax.swing.JFrame;
public class FractalTree extends Canvas {
private JFrame frame;
//Breedte en hoogte voor GUI
private final int WINDOW_WIDTH = 1280;
private final int WINDOW_HEIGHT = 720;
public FractalTree() {
frame = new JFrame("Fractal Tree");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(WINDOW_WIDTH, WINDOW_HEIGHT);
frame.setLocationRelativeTo(null);
frame.setResizable(false);
frame.add(this);
frame.setVisible(true);
}
public static void main(String[] args) {
FractalTree ft = new FractalTree();
ft.setVisible(true);
ft.setBackground(Color.black);
}
class FractalPanel extends JPanel implements ActionListener {
private int x;
private int y;
private int xNew;
private int yNew;
private double angle;
private int depth;
public FractalPanel() {
setBackground(Color.black);
Timer timer = new Timer(200, this);
}
public void paintComponent(Graphics g) {
g.setColor(Color.cyan);
drawFractalTree(g, WINDOW_WIDTH / 2, WINDOW_HEIGHT - 75, -90, 11);
}
public void drawFractalTree(Graphics g, int x, int y, double angle, int depth) {
if (depth == 0) {
} else {
int xNew = x + (int) (Math.cos(Math.toRadians(angle)) * depth * 10.0);
int yNew = y + (int) (Math.sin(Math.toRadians(angle)) * depth * 10.0);
Graphics2D g2d = (Graphics2D) g;
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setStroke(new BasicStroke(0.5f * depth));
g2d.drawLine(x, y, xNew, yNew);
drawFractalTree(g, xNew, yNew, angle + 30, depth - 1);
drawFractalTree(g, xNew, yNew, angle - 30, depth - 1);
}
}
public void actionPerformed(ActionEvent e) {
if (depth == 0) {
} else {
int xNew = x + (int) (Math.cos(Math.toRadians(angle)) * depth * 10.0);
int yNew = y + (int) (Math.sin(Math.toRadians(angle)) * depth * 10.0);
repaint();
}
}}}
附言:对不起,我的英语不好
发布于 2014-03-31 16:21:34
不要把swing和awt (Canvas和JFrame)混为一谈。您可以扩展JPanel并覆盖paintComponent(Grahics g)方法,而不是使用canvas,在该方法中您可以完成所有绘图。
不要在paint中调用Thread.sleep(10);。它只是阻塞事件分派器线程,并阻止绘制。
而是为每个所需的时间间隔创建一个要调用的Timer。在计时器的操作中,更改模型(x,y等)并调用repaint()来反映更改。
https://stackoverflow.com/questions/22756639
复制相似问题