根本没有任何东西出现...... 我已经尝试将随机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);
}
}
}
答案 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。这可能会更有效率。