Sierpinski Triangle:没有显示

时间:2017-01-15 18:38:18

标签: java swing

根本没有任何东西出现...... 我已经尝试将随机rand = new Random()移动到循环外部,但它仍然无法正常工作。 框架也不会在关闭时退出。

public class myMain {

    public static void main(String args[]) {
        Frame frame = new Frame();
    }
}


public class Frame extends JFrame {

    public Frame(){
        super("Fancy Triangle");
        setSize(1024, 768);

        myPanel panel = new myPanel();
        add(panel);

        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setVisible(true);
    }

}

public class myPanel extends JPanel {

    int x1 = 512;

    int y1 = 109;

    int x2 = 146;
    int y2 = 654;

    int x3 = 876;
    int y3 = 654;

    int x = 512;
    int y = 382;

    int dx, dy;

    Random rand;

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);

        for (int i = 0; i < 50000; i++) {

            g.drawLine(x, y, x, y);
            try {
                Thread.sleep(300);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            rand = new Random();
            int random = 1 + rand.nextInt(3);

            if (random == 1) {
                dx = x - x1;
                dy = y - y1;

            } else if (random == 2) {
                dx = x - x2;
                dy = y - y2;

            } else {
                dx = x - x3;
                dy = y - y3;

            }

            x = x - (dx / 2);
            y = y - (dy / 2);

        }
    }
}

1 个答案:

答案 0 :(得分:2)

此:

Thread.sleep(300);

没有做你打算做的事。我认为你试图延迟画画,但这不是它的作用。相反,你在Swing事件线程上调用sleep会使整个应用程序进入休眠状态,因为线程无法执行它需要做的事情,包括绘制应用程序并与用户交互。更糟糕的是,你在绘画方法中这样做,这种方法需要非常快,因为Swing应用程序的感知响应性通常由绘画速度决定。

而是使用Swing Timer(Swing Timer tutorial)来更改类的字段状态,然后调用repaint。让paintComponent使用这些更改的字段来决定要绘制的内容和位置。由于Sierpinski三角形由点组成,因此请考虑创建ArrayList<Point>,删除绘制方法中的for循环,并使用Swing Timer替换此for循环。在Timer的ActionListener中,将半随机点放入ArrayList并调用repaint。然后在paintComponent中,遍历ArrayList,绘制它包含的每个点。

或者,您可以将点绘制到Swing Timer中的BufferedImage上,然后让paintComponent通过g.drawImage(...)方法调用显示BufferedImage。这可能会更有效率。