java–谢尔宾斯基地毯
本程序将使用递归画出谢尔宾斯基地毯,首先我们将主类继承JFrame类,因为要使用JFrame类生成一个窗体,然后在其中定义一个初始化方法:
public void initUI(){
this.setSize(800,600);
this.setDefaultCloseOperation(MyJFrame.EXIT_ON_CLOSE);
this.setLocationRelativeTo(null);
this.setLayout(new FlowLayout());
this.setVisible(true); //设置可见
}
this.setSize(800,600);设置窗体的长度为800,宽度为600;
this.setDefaultCloseOperation(MyJFrame.EXIT_ON_CLOSE);设置点击窗体的关闭按钮为结束程序;
this.setLocationRelativeTo(null);设置窗口相对于指定组件的位置;
this.setLayout(new FlowLayout());设置布局为流式布局;
this.setVisible(true); 设置窗体显示,直到该语句整个窗体才算生成完毕。
生成完窗体后,我们需要在窗体中画出谢尔宾斯基地毯,这时我们需要使用到窗体的画笔(每个窗体都有自己的画笔),通过画笔在窗体上画出一个个矩形构成谢尔宾斯基地毯。我们在继承JFrame类后,我们可以复写JFrame类中的paint方法,该方法会在每次窗体刷新的时候进行调用(窗体刷新包括改变窗体大小,第一次生成窗体),且该方法的参数是该窗体的画笔对象,因此我们只需要复写该方法并且在该方法中绘画即可,
public void paint(Graphics g) {
// TODO Auto-generated method stub
super.paint(g);
g.drawRect(0, 0, this.getWidth(), this.getHeight());
this.test(g, 0, 0, this.getWidth(), this.getWidth(),4);
}
private int test(Graphics g, int x, int y, int l, int w, int num) {
if (num == 0) {
return 1;
}
int temp = x;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (i == 1 && j == 1) {
g.fillRect(x, y, l, w);
}else
g.drawRect(x, y, l, w);
test(g, x, y, l / 3, w / 3, num - 1);
x += l;
}
x = temp;
y += w;
}
return 1;
}
super.paint(g);调用父类的paint方法
g.drawRect(0, 0, this.getWidth(), this.getHeight());使用画笔进行画出一个矩形,矩形左上点的坐标0,0,长度为窗体的长度,高度为窗体的高度
this.test(g, 0, 0, this.getWidth(), this.getWidth(),4);调用递归方法,画出谢尔宾斯基地毯,第一个参数为画笔g,第二个参数与第三个参数为坐标(x,y),第三个参数为矩形长度与宽度,第五个参数为递归次数。
在test方法中第一个if判断为递归结束的判断,然后有一个双重循环,该循环次数都为3,表示画九个矩形,内循环中判断该矩形是否为中间的矩形,如果是则画一个填充矩形,否则画一个无填充矩形,然后调用本身,在当前画的矩形当中再画九个矩形,直到num的值等于0才结束递归,num的值决定画多少次九个矩形,然后再for循环中,每内循环一次,横坐标的值都要加上长度,因为要画第二个矩形,每外循环一次,横坐标都要置为原来的值,纵坐标的值都要加上高度。