`
时间被海绵吃了
  • 浏览: 6169 次
  • 性别: Icon_minigender_1
  • 来自: 湖北
文章分类
社区版块
存档分类
最新评论

画图板中重绘功能遇到的问题

阅读更多
画图板的功能还在日趋完善,现在正在努力实现利用自定义队列存储绘图信息然后重绘的功能,在实现这个功能的过程中,遇到的最多的异常就是java.lang.ClassCastException了,



造成这个异常的原因就是重绘时读取存储的信息时出现了错误,导致一些类赋值时不匹配。

就拿直线来说,我们要保存直线的信息,需要在每次画完直线时存储这条直线的信息,即在鼠标释放(MouseReleased)里面添加直线的首尾两个点的坐标、用于判断图形类型的标识符、图像线条的粗细以及直线的颜色。代码如下:
( 其中x1,y1为直线的第一个点即鼠标按下的点的坐标,list为用于存放信息的自定义队列。)
//鼠标释放的监听
public void mouseReleased(MouseEvent e)
{
	x2 = e.getX();
	y2 = e.getY();

	//保存两个点
	list.add(x1);
	list.add(y1);
	list.add(x2);
	list.add(y2);
		
	if("line".equals(shape_command))		
	{
		//画直线
		g.drawLine(x1, y1, x2, y2);
		//保存画笔粗细
		list.add(0);
		//保存标识符
		list.add("line");
		//保存颜色
		list.add(color_command);
	}      
}


然后我们会在DrawPanel里面的paint方法依次取出list里面的各项信息。
public void paint(Graphics g)
{
	super.paint(g);
		
	for(int i=0;i<list.length()/7;i++)
	{
		//取出保存的两个点
		int x1 = (Integer)list.get(7*i);
		int y1 = (Integer)list.get(7*i+1);
		int x2 = (Integer)list.get(7*i+2);
		int y2 = (Integer)list.get(7*i+3);
		int size_command = (Integer)list.get(7*i+4);
		//取出图形命令
		String command = (String)list.get(7*i+5);
		//取出颜色
		Color color = (Color)list.get(7*i+6);
		
		g.setColor(color);
			
		//重绘
		if("line".equals(command))
		{
			//重绘直线
			g.drawLine(x1,y1,x2,y2);
		}        	
	}
}


如上,正因为重绘是“依次”来取的,所以任何一个存放的信息顺序出现了问题,取信息时就会有错误发生,比如将Color类型的信息复制给了String类型的command等。这就需要我们完全掌握程序执行的顺序,确保每一个信息存放的时候都是以7项为单位,按照指定的顺序依次存放的。

当我第一次出现这个问题时不知道怎么做,因为系统只提示出出现了ClassCastException这个异常,只告诉是哪一行有问题,但是不能指出是哪一个变量提取时出错了。到后来我再遇到这个问题时,我能明白这个问题出现的原因,我会马上去画图的方法里去寻找存放顺序可能出现问题的地方,往往问题就出在那里。

还有一点是检测有没有问题的方法,我觉得画一个图形重绘成功是不能说明什么问题的,要测试重绘的方法有没有出现ClassCastException异常,最好用多个图形。比如我在实现重绘铅笔功能的时候,画一条线能成功重绘,但是画两条的时候就会报异常了。这个错误我个人觉得很经典,因为这个错误不是在MouseDragged里面产生的,而是在鼠标释放的方法里面。鼠标释放的部分代码已经附在上面了,可以看到,在判断画直线之前程序就已经存放了两个点,而我实现画铅笔的功能并没有用MouseReleased方法,所以在保存铅笔信息的最后就莫名其妙地多了两个点的坐标,这样第一条直线重绘的时候并不会出错,因为只是多了两个点而已,程序取不到String类型的command和Color类型的color,所以自然不会出现类转换异常的ClassCastException,然而第二次取的时候就会报异常了,因为这些信息在队列里会和第二条线结合起来,重绘的时候再取顺序就会不匹配了。

既然已经发现问题,要解决这个问题也就很简单了,即再自行添加一个标识符就行了:

//鼠标释放的监听
public void mouseReleased(MouseEvent e)
{
	x2 = e.getX();
	y2 = e.getY();

	//保存两个点
	list.add(x1);
	list.add(y1);
	list.add(x2);
	list.add(y2);
		
	if("line".equals(shape_command))		
	{
		//画直线
		g.drawLine(x1, y1, x2, y2);
		//保存画笔粗细
		list.add(0);
		//保存标识符
		list.add("line");
	}else if("pencil".equals(shape_command))
	{
		//保存画笔粗细
		list.add(0);
		//添加铅笔标志位
		list.add("pencil");
	}
        //保存颜色
	list.add(color_command);     
}


我们需要注意的是发现这个问题很不容易,我们需要非常了解这个代码的执行顺序以及各种功能的逻辑,发现问题并解决很重要,更重要的时能得到经验,避免以后再出现类似的错误。
  • 大小: 15.6 KB
分享到:
评论

相关推荐

    简单画图板的设计

    10. **性能优化**:对于大规模的绘图操作,可能需要关注性能优化,如减少不必要的重绘,利用缓存技术提高效率,或者采用异步处理以避免阻塞用户界面。 以上就是关于"简单画图板的设计"的一些核心知识点。实际实现时...

    基于java的画图板

    在这个画图板项目中,`DrawPanel`很可能就是一个继承自`JPanel`的类,用于实现绘图功能。 **绘图板实现** 1. **绘图面板初始化**:`DrawPanel`类会覆盖`paintComponent(Graphics g)`方法,这个方法在需要重绘组件...

    C# 仿window画图板

    当控件需要重绘时,系统会触发这个事件。我们可以在事件处理函数中使用`Graphics`对象来绘制线条、曲线、形状等。 3. **Graphics对象**:`System.Drawing.Graphics`类是用于在设备上下文上执行图形操作的核心类。...

    原生JS使用Canvas实现拖拽式绘图功能

    原生JS使用Canvas实现拖拽式绘图功能的知识点涵盖了Canvas API的基础应用、面向对象编程思想在Canvas绘图中的运用以及...在实现过程中可能会遇到的问题,例如图片重绘导致的闪烁,会在后续的版本迭代中继续完善和优化。

    window 画图工具

    在Windows操作系统中,"画图工具"是一款内置的基础图像编辑软件,它提供了基本的绘画和图像处理功能。这款工具对于日常的小幅修改图片或者简单的绘图任务非常实用,尤其适合那些不需要复杂图形编辑功能的用户。 ...

    MFC模拟windows绘图板

    在本文中,我们将深入探讨如何使用Microsoft Foundation Classes (MFC) 模拟Windows自带的绘图板功能。MFC是一个C++库,它为开发者提供了一种构建Windows应用程序的便捷方式,尤其适合初学者入门。 首先,理解MFC的...

    MFC 直线画图程序

    在实际的代码实现中,可能需要优化 `OnSize()` 和 `OnPaint()` 方法以确保在窗口大小变化时正确地重绘直线,避免出现视觉问题。例如,可能会遇到直线断裂或没有正确缩放的情况。这通常需要正确地处理逻辑像素和设备...

    信息技术教案——画图.pdf

    教学过程涉及实践环节,以完成一幅“大草原”画作为例,指导学生使用铅笔工具画出线条,使用填充色填充图形,并介绍在遇到问题时如何使用放大镜、撤销命令以及填补图形缺口。此外,还教授了保存文件的步骤,包括选择...

    硬件绘图软件Protel的使用

    - **问题描述**:当使用Protel时,可能会遇到元件库无法正常加载的情况,这会导致设计过程中无法使用特定的元件,严重影响工作效率。 2. **解决方案** - **默认加载的元件库**:Protel在启动时会默认加载`...

    C# winform 画板

    例如,我们可以在`Paint`事件中进行图形的重绘,确保每次窗口大小改变或被覆盖后,画布上的图形都能正确显示。 6. **图形状态**:为了支持撤销/重做功能,需要保存用户的绘图操作历史。可以使用堆栈数据结构,每当...

    windows10 mspaint

    然而,有时用户可能会遇到一些问题,比如无法打开或创建新文件,这可能是因为系统文件损坏、更新问题或者软件冲突导致的。针对这些问题,我们可以采取一些解决方案。 1. **检查系统更新**:确保你的Windows 10已经...

    autocad绘图常见疑难解答

    ### autocad绘图常见疑难解答 #### 一、工具栏和窗口拖动限制 疑问:在绘图的时候,为什么不能随意...以上解答涵盖了AutoCAD绘图中常见的问题及其解决方法,希望能帮助读者提升绘图效率和解决实际绘图中遇到的难题。

    MFC小画笔程序代码

    在小画笔程序中,良好的错误处理能确保程序在遇到问题时能够优雅地失败并提供反馈。 通过对这个"MFC小画笔程序"的源代码进行分析和学习,开发者不仅可以掌握MFC的基本用法,还能提升在图形用户界面设计和交互式应用...

    随手涂鸦 画板

    同时,为了提供保存和清除功能,我们需要实现保存当前画布为图片的功能,可以使用Bitmap和BitmapFactory来处理,而清除功能则可以通过重绘整个Canvas来实现。 在Android Studio中,我们可以使用XML布局文件来设计...

    机械设计心得体会(精选多篇).pdf

    6. 问题解决与团队协作:设计师应具备分析和解决问题的能力,这在遇到设计难题时尤为重要。团队合作可以帮助解决复杂问题,集思广益,使作品更加完善。 7. 基础知识的应用:机械设计课程设计通常要求将所学的基础...

    wxPython之解决闪烁的问题

    不匹配的颜色可能导致额外的重绘,引起闪烁。在创建窗口时,可以使用`wx.SystemSettings.GetColour`获取系统颜色。 在生成PDF文件方面,`reportlab`是一个强大的Python库,它可以方便地创建复杂的PDF文档。`pdfgen`...

    2011最新整理Java练习题

    - C) 程序执行过程中遇到的事先没有预料到的情况 - D) 程序事先定义好的可能出现的意外情况 **解析**: - **选项C**:正确。异常主要用于处理程序运行时发生的意外情况,这些情况往往是事先不可预测的。 - **选项D*...

Global site tag (gtag.js) - Google Analytics