首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java 2D-Graphics :动画分形树

Java 2D-Graphics :动画分形树
EN

Stack Overflow用户
提问于 2014-03-31 16:16:08
回答 1查看 1.2K关注 0票数 0

我在试着画一棵分形树。

它将绘制树,但我想制作一个动画,这样树就可以从它的“树干”中生长?另外,是否有可能使动画流畅呢?

如果我使用Thread.sleep方法,它会画出非常奇怪的树。

能帮我的人吗?非常感谢

下面是我的代码:

代码语言:javascript
复制
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();
    }

}

}}

附言:对不起,我的英语不好

EN

回答 1

Stack Overflow用户

发布于 2014-03-31 16:21:34

不要把swing和awt (CanvasJFrame)混为一谈。您可以扩展JPanel并覆盖paintComponent(Grahics g)方法,而不是使用canvas,在该方法中您可以完成所有绘图。

不要在paint中调用Thread.sleep(10);。它只是阻塞事件分派器线程,并阻止绘制。

而是为每个所需的时间间隔创建一个要调用的Timer。在计时器的操作中,更改模型(x,y等)并调用repaint()来反映更改。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22756639

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档