画板完整版代码

package com.yzd1129.DrawRecursion;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;

import javax.swing.JButton;
import javax.swing.JFrame;

public class Board {
    
    
public void ShowDraw() {
    
    
	JFrame jf = new JFrame("画板");
	//窗体初始化属性
	jf.setSize(800,600);//窗体大小,横x纵y
	jf.setLocationRelativeTo(null);//使窗体显示在屏幕中央
	jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//窗体关闭时即程序退出
	
	//设定流式布局
	FlowLayout flayout = new FlowLayout();
	jf.setLayout(flayout);
	//创建监听事件处理类
	DrawListener dlistener = new DrawListener();
	//给界面加监听 画曲线时既要监听动作即按钮是否被按下(获取按下时坐标)  还要监听鼠标移动(获取实时坐标)
	jf.addMouseListener(dlistener);
	jf.addMouseMotionListener(dlistener);
	
	//增加画图选项 增加到界面上 增加监听
	String[] jname = {
    
    "直线","矩形","曲线","分形图","立体图","三点分形","概率画图","递归直线"};
	for(int i=0;i<jname.length;i++) {
    
    
		JButton jline = new JButton(jname[i]);
		jf.add(jline);
		jline.addActionListener(dlistener);
	}

    //创建颜色数组 增加到界面上 增加监听
	Color[] color = {
    
    Color.RED,Color.GREEN,Color.BLUE};
	for(int i=0;i<color.length;i++) {
    
    
		JButton jcolor = new JButton();
		jcolor.setBackground(color[i]);
		jcolor.setPreferredSize(new Dimension(30,30));
		jf.add(jcolor);
		jcolor.addActionListener(dlistener);
	}


	jf.setVisible(true);//可视化之前是不可以显示Graphics的

	Graphics g = jf.getGraphics();	//增加图形属性g,直接绑定在窗体jf上
	dlistener.g = g;//将上一行Graphics类属性g 赋给监听器对象的属性
} 

public static void main(String[] args) {
    
    
	Board dbroad = new Board();
	dbroad.ShowDraw();
}
}

package com.yzd1129.DrawRecursion;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.util.Random;

import javax.swing.JButton;

public class DrawListener implements MouseListener,ActionListener,MouseMotionListener{
    
    
	Graphics g = null;//Grahpics不能创建对象,Grahpics是个抽象类
	int xDown,yDown,xUp,yUp,x,y ;
	String Bname;
	Color red = new Color(255,0,0);
	Color black = new Color(0,0,0);
	
	
	@Override
	//鼠标监听器的方法
    public void mouseClicked(MouseEvent e) {
    
    
    	System.out.println("鼠标点击");
    }

    public void mousePressed(MouseEvent e) {
    
    
    	//获取按下时的坐标
    	 xDown=e.getX();
    	 yDown=e.getY();
    	 
    	System.out.println("鼠标按下");
    }

    public void mouseReleased(MouseEvent e) {
    
    
    	//获取释放时坐标
    	 xUp=e.getX();
    	 yUp=e.getY();
    	 
    	 //根据按钮画指定图形
       	 if(Bname.equals("直线")) {
    
    
       		System.out.println(Bname);
       		g.drawLine(xDown, yDown, xUp, yUp);
       	} 
       	else if(Bname.equals("矩形")) {
    
    
       		System.out.println(Bname);
       		if(xDown<xUp) {
    
    
       		g.drawRect(xDown,yDown, xUp-xDown,yUp-yDown);
       		}else {
    
    
       			g.drawRect(xDown-(xDown-xUp),yDown-(yDown-yUp), Math.abs(xUp-xDown), Math.abs(yUp-yDown));
       		}
       	}else if(Bname.equals("立体图")) {
    
    
       		for(int i=0;i<100;i++){
    
    
    			g.setColor(new Color(i*2, 100+i, i*2+50));
    			g.fillOval(xUp+i/3, yUp+i/3, 100-i, 100-i);
    		}
       	}else if(Bname.equals("分形图")) {
    
    
       		//System.out.println(Bname);
       		double a=-1.4,b=1.6,c=1.0,d=0.7;
       		double x=0.0,y=0.0;
       		for(int i=0;i<25500;i++) {
    
    
       			//System.out.println(i);
       			double temx = Math.sin(a*y)+c*Math.cos(a*x);
       			double temy = Math.sin(b*x)+d*Math.cos(b*y);
       			x=temx;
       			y=temy;
       			int drawx = (int)(temx*50+xDown);
       			int drawy = (int)(temy*50+yDown);
       			//g.setColor(new Color(0,0,i/100));
       			g.drawLine(drawx, drawy, drawx, drawy);
       			
       			System.out.println(drawx+"    "+drawy);
       		}
       	}else if(Bname.equals("三点分形")) {
    
       //平面随机生成三个点  再随机生成点xp  掷色子选中三点之一
       		Random random = new Random();
       		int x1 = (int)(Math.random()*500);//生成随机坐标x1
       		int y1 = (int)(Math.random()*500);//生成随机坐标y1
       		int x2 = (int)(Math.random()*500);//生成随机坐标x2
       		int y2 = (int)(Math.random()*500);//生成随机坐标y2
       		int x3 = (int)(Math.random()*500);//生成随机坐标x3
       		int y3 = (int)(Math.random()*500);//生成随机坐标y3
       		int xp = (int)(Math.random()*500);//生成随机点xp
       		int yp = (int)(Math.random()*500);//生成随机点yp
       		for(int i=0;i<10000;i++) {
    
    
       			int k=random.nextInt(3);
       			if(k==0) {
    
    
       				g.drawLine((x1+xp)/2,(y1+yp)/2,(x1+xp)/2,(y1+yp)/2);
       				System.out.println((x1+xp)/2+"   "+(y1+yp)/2);
       				xp=(x1+xp)/2;
       				yp=(y1+yp)/2;
       			}else if(k==1) {
    
    
       				g.drawLine((x2+xp)/2,(y2+yp)/2,(x2+xp)/2,(y2+yp)/2);
       				System.out.println((x2+xp)/2+"   "+(y2+yp)/2);
       				xp=(x2+xp)/2;
       				yp=(y2+yp)/2;
       			}else if(k==2) {
    
    
       				g.drawLine((x3+xp)/2,(y3+yp)/2,(x3+xp)/2,(y3+yp)/2);
       				System.out.println((x3+xp)/2+"   "+(y3+yp)/2);
       				xp=(x3+xp)/2;
       				yp=(y3+yp)/2;
       			}
       		}
       	}
       	else if (Bname.equals("概率画图")) {
    
    //画图分为5种情况   每种情况概率相等   每次仅画其中的一种情况
       		double a,b,c,d,e1,f;
       		double x=0.0,y=0.0;
       		Random random = new Random();
       		for(int i=0;i<10000;i++) {
    
    
       		int k=random.nextInt(5);
       		if(k==0) {
    
    
   				a=0.1950;b=-0.4880;c=0.3440;d=0.4430;e1=0.4431;f=0.2452;
   				double temx=a*x+b*y+e1;
   				double temy=c*x+d*y+f;
   				int drawx = (int)(temx*500+xDown);
   				int drawy = (int)(temy*500+yDown);
   				g.drawLine(drawx, -drawy+800, drawx, -drawy+800);
   				x=temx;
   				y=temy;
   				System.out.println(drawx+"  "+drawy);
   				
       		}else if(k==1) {
    
    
   				a=0.4620;b=0.4140;c=-0.2520;d=0.3610;e1=0.2511;f=0.5692;
   				double temx=a*x+b*y+e1;
   				double temy=c*x+d*y+f;
   				int drawx = (int)(temx*500+xDown);
   				int drawy = (int)(temy*500+yDown);
   				g.drawLine(drawx, -drawy+800, drawx, -drawy+800);
   				System.out.println(drawx+"  "+drawy);
   				x=temx;
   				y=temy;
       		}else if(k==2) {
    
    
   				a=-0.6370;b=0.0000;c=0.0000;d=0.5010;e1=0.8562;f=0.2512;
   				double temx=a*x+b*y+e1;
   				double temy=c*x+d*y+f;
   				int drawx = (int)(temx*500+xDown);
   				int drawy = (int)(temy*500+yDown);
   				g.drawLine(drawx, -drawy+800, drawx, -drawy+800);
   				System.out.println(drawx+"  "+drawy);
   				x=temx;
   				y=temy;
       		}else if(k==3) {
    
    
   				a=-0.0350;b=0.0700;c=-0.4690;d=0.0220;e1=0.4884;f=0.5069;
   				double temx=a*x+b*y+e1;
   				double temy=c*x+d*y+f;
   				int drawx = (int)(temx*500+xDown);
   				int drawy = (int)(temy*500+yDown);
   				g.drawLine(drawx, -drawy+800, drawx, -drawy+800);
   				System.out.println(drawx+"  "+drawy);
   				x=temx;
   				y=temy;
       		}else if(k==4) {
    
    
   				a=-0.0580;b=-0.0700;c=0.4530;d=-0.1110;e1=0.5976;f=0.0969;
   				double temx=a*x+b*y+e1;
   				double temy=c*x+d*y+f;
   				int drawx = (int)(temx*500+xDown);
   				int drawy = (int)(temy*500+yDown);
   				g.drawLine(drawx, -drawy+800, drawx, -drawy+800);
   				System.out.println(drawx+"  "+drawy);
   				x=temx;
   				y=temy;
   			}
       		}

       		}
       	else if(Bname.equals("递归直线")) {
    
    
        MyDrawLine(6,xDown,yDown,xDown+600,yDown);//三等分画线,6为递归结束条件
       	    
       	}
       	System.out.println("鼠标释放");
       	}
       	 
    	


    public void mouseEntered(MouseEvent e) {
    
    
    	System.out.println("鼠标进入");
    }

    public void mouseExited(MouseEvent e) {
    
    
    	System.out.println("鼠标退出");
    }
    
    
    @Override
    //鼠标移动监听器的方法
    //鼠标拖拽
    public void mouseDragged(MouseEvent e) {
    
    
    	if(Bname.equals("曲线")) {
    
    
        	x=e.getX();
        	y=e.getY();
            g.drawLine(xDown,yDown,x,y);
            xDown=x;
            yDown=y;
    	}

    }
    //鼠标移动
    public void mouseMoved(MouseEvent e) {
    
    

    }
    
    
    @Override
    //动作监听器的方法  按下之后要执行的动作
    public void actionPerformed(ActionEvent e) {
    
    
    	 //获取当前事件源内容
    	JButton jbu = (JButton)e.getSource();//获取当前事件源对象,是个按钮类型的对象jbu
    	 Color color = jbu.getBackground();//得到按钮背景颜色
    	 if(e.getActionCommand().equals("")) {
    
    //得到按钮上的字符串,根据有无字符串判断改变颜色或者获得获得字符串名字
    		g.setColor(color);//改变画笔颜色,将按钮背景颜色设置为画笔颜色
    	 }else {
    
    
    		 Bname = e.getActionCommand();//不是颜色按钮则获得按钮上的字符串
    	 }
    }
    
    public void MyDrawLine(int n,int x1,int y1,int x2,int y2) {
    
    //自定义方法递归画直线  n为递归结束条件
    	if(n==0) {
    
    //递归终止条件
    		return;//终止处理
    	}
    	g.drawLine(x1, y1, x2, y2);//初始线
    	int xL1=x1;int yL1=y1+40;int xL2=x1+(x2-x1)/3;int yL2=y1+40;//计算左三等分线坐标
    	MyDrawLine(n-1,xL1,yL1,xL2,yL2);//递归调用,每调用一次n-1
    	//System.out.println(n);
    	int xR1=x2-(x2-x1)/3;int yR1=y2+40;int xR2=x2;int yR2=y2+40;//计算右三等分线坐标
    	MyDrawLine(n-1,xR1,yR1,xR2,yR2);//递归调用,每调用一次n-1
    	//System.out.println(n);
    }
     
} 

猜你喜欢

转载自blog.csdn.net/weixin_43722843/article/details/110382336