【JAVA】 画板


目前画板实现了多边形、橡皮擦、吸管、铅笔、刷子、直线、矩形、椭圆的功能

 

基本思路:

1.      将窗体分为左、中、下面板

2.      左边添加按钮并设置相应的方法在中面板进行绘图

3.      将已画出图形进行重绘

4.      颜色设置目前还没完成,做完了再更新

 

总共五个类:

DBFrame:入口;负责主窗口的各种设置

JpDown: 是JPanel的子类,负责下面板的设置

JpCenter: 是JPanel的子类,负责中心面板的绘制,与重绘功能的实现

JpLeft: 是JPanel的子类,负责左边面板的按钮设置,按钮图像通过按钮对象的.setIcon、.setRolloverIcon、.setPressedIcon、.setSelectedIcon进行设置

MouActive:是MouseMotionAdapter和MouseListener的子类,负责各按钮功能与重绘。

 

重点写MouActive中对上述各功能方法的实现过程

首先通过对当前选定按钮的命令判断当前按钮

1.多边形(伪代码):

public void mouseReleased(MouseEvent e) {
if(bl){		   //bl默认设置true,表示画第一条直线
				gr.drawLine(x1, y1, x2, y2); //x1,y1是按下点坐标、x2,y2是释放点坐标
				bl = false;
				xfirst = x1;  //最后结束图形时,需要连接第一个点,先存起来
				yfirst = y1;
			}else{
				gr.drawLine(x3, y3, x2, y2);
			}
		x3 = x2;//非第一条直线,需要存储先一次的释放点坐标作为这一次起始点
			y3 = y2;
}	
public void mouseClicked(MouseEvent e) {
		Count = e.getClickCount();
		//多边形最后双击结束
		if(Count==2){
			gr.drawLine(xfirst, yfirst, x2, y2);
			bl = true;
		}
	}

2.橡皮擦(伪代码)

public void mouseReleased(MouseEvent e) {
x2 = e.getX();//获取当前释放点坐标
			y2 = e.getY();
			gr.setColor(Color.white);//设置画笔颜色为中心面板底色
			((Graphics2D)gr).setStroke(new BasicStroke(8));//设置宽度为8
			((Graphics2D)gr).drawLine(x1, y1, x2, y2);//画直线;x1,y1是按下点坐标
			x1 = x2;//将先一次的释放点作为下一次起始点存储起来
			y1 = y2;
			((Graphics2D)gr).setStroke(new BasicStroke(1));//将画笔宽度设回1
}

3.   吸管(伪代码)

public void mouseReleased(MouseEvent e) {
x2 = e.getXOnScreen();//取得当前坐标位置
			y2 = e.getYOnScreen();
			try {		//使用机器人类Robot需要使用try catch
				Robot bo = new Robot();
				Color color = bo.getPixelColor(x2, y2);//取到当前位置点的像素颜色
				gr.setColor(color);//设置画笔颜色为刚刚取的颜色
			} catch (AWTException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
}

4.  铅笔(伪代码)


public void mouseReleased(MouseEvent e) {
x2 = e.getX();//取当前点坐标
			y2 = e.getY();
			gr.drawLine(x1, y1, x2, y2);//画直线
			x1 = x2; //将先一次的释放点作为下一次起始点存储起来
				y1 = y2;
}

5.  刷子(伪代码)

public void mouseReleased(MouseEvent e) {
x2 = e.getX();//取当前点坐标
			y2 = e.getY();
			gr = (Graphics2D)gr;//将Graphics强转
			for(int i=0;i<30;i++){		
				int rdint0 = (int)(Math.random()*10)-5; //随机在当前位置点附近取点
				int rdint1 = (int)(Math.random()*10)-5;
				gr.drawLine(x1+rdint0, y1+rdint1, x2+rdint0, y2+rdint1);//绘点
			}
			x1 = x2; //将先一次的释放点作为下一次起始点存储起来
				y1 = y2;
}

6.直线(伪代码)

public void mouseReleased(MouseEvent e) {
x2 = e.getX();//取当前点坐标
			y2 = e.getY();
			gr.drawLine(x1, y1, x2, y2);//画直线
}

7.矩形(伪代码)

public void mouseReleased(MouseEvent e) {
x2 = e.getX();//取当前点坐标
			y2 = e.getY();
			g.drawRect(Math.min(x2, x1), Math.min(y1, y2), Math.abs(x1-x2), Math.abs(y1-y2));
}

8.椭圆(伪代码)

public void mouseReleased(MouseEvent e) {
x2 = e.getX();//取当前点坐标
		y2 = e.getY();
	g.drawOval(Math.min(x2, x1), Math.min(y1, y2), Math.abs(x1-x2), Math.abs(y1-y2));
}

重绘功能(多态):

通过重新定义一个Shapes类,封装按下点x1,y1与释放点x2,y2和画笔颜色等属性。直线重绘定义LineShapes类、矩形重绘定义RectShapes类、椭圆重绘定义OvalShapes类分别继承Shapes类,并在重绘类中进行draw方法进行不同的重写。将不同的对象放在同一个ArrayList中,然后在JpCenter中遍历ArrayList中的对象,并调用对象的draw方法。

 

注意:

不同类中的参数互相调用,可以再主函数中进行类的实例化时,通过构造函数的重载进行传参


1. 画板UI设计(总体布局) (1)创建窗体并设置相关属性; (2)给整个窗体添加一个中间容器用来覆盖整个窗体; (3)设置边框布局,因为整个画板大致为左边部分,中间部分,菜单栏三个部分,用边框布局比较合适; (4)给窗体添加左面板,中间面板; (5)给左面板添加按钮,并设置按钮图片和效果; (6)给左面板添加左子面板,用来存放颜色按钮; 2.画板功能设计 (1)给左画板中的按钮组中的每个按钮添加鼠标监听器; (2)点击不同按钮,绘制不同的图形; (3)给左子面板中的每个颜色按钮添加鼠标监听器; (4)根据下面板中选中的颜色按钮,来获取按钮的背景颜色,并将该颜色设置成画笔的颜色; (5)铅笔功能 1、铅笔是鼠标拖动时画的线,所需要实现鼠标移动监听器,我们采用一个类来实现多个接口; 2、添加新的鼠标监听器类; 3、在鼠标移动时间中实现画笔的逻辑(其实就是绘制直线,鼠标每移动一个像素,就会触发移动事件,通过移动事件获取鼠标的坐标,与上一次移动的坐标连线就可以了; (6)刷子功能 刷子其实就是加粗的画笔,画出来的直线更粗,这里需要用到Graphic2D画笔来设置画笔的粗细。 (7)橡皮擦功能 橡皮擦就是把画笔颜色设置成相同的背景颜色就可以了,拖动鼠标时进行擦除,所以在鼠标拖动事件中编写。 (8)喷桶功能 1、定位方法:鼠标拖动事件实现; 2、随机数生成:Random; 3、实现原理,在鼠标拖动附近绘制很多的原点; 3. 画板的保存和重绘的设计 (1)给我们的画板添加菜单条、菜单以及菜单项 (2)给每个菜单项添加监听器 (3)点击不同的菜单项实现相应的功能 (4)图形保存功能:利用对象输出流,将容器对象写入文件; (5)打开图形功能:利用对象输入流,将容器对象读入,然后将容器里面的图形对象在画板上绘制出来 (6)新建文件功能:新建文件,将画板上绘制的内容清空(清空之前可以确认是否需要进行保存)清屏(重绘)功能依次方法; (7)文件保存格式为BMP格式; (8)文字功能:读取文本框中的文本并打印到屏幕鼠标的相应的响应位置,传入输入的文字大小的参数,以此来改变文字的大小; 4.弹泡泡功能的设计 根据Java多线程来实现弹泡泡功能;泡泡的位置颜色随机出现,并且做到碰到边框会变色;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值