Java项目之画图板(三)
来源:互联网 发布:什么云计算 编辑:程序博客网 时间:2024/06/05 01:53
在上一个版本中即画图板(二)中,我们进行了代码重构,将一个类重构成了几个类,每个类负责一个模块,在这个版本中,我们主要解决一些bug和不足
需要解决的问题
窗体在改变大小的时候,在比原先窗体大的那部分画图形会发现画的图形没显示出来,在改变一下窗体才会显示出来
- 用鼠标拖着画图形的时候显示将图形显示出来,(上一个版本中就是只有在鼠标释放的时候才显示出来)
解决方案
解决图形在窗体改变大小时图形不显示:
- 为什么会不显示:在窗体改变大小的时候,变大的那一部分面板,还没刷新,还没调用,所以才会导致没有显示,再次改变窗体大小的时候才会显示出来
解决方案:
这儿会用到一个方法,重绘,需要重写paint(Graphics g)方法,既然是重绘,所以就需要一个容器来保存以前画的那些图形,此版本中用的是LinkedList< T >,画笔每画一笔都保存下来
保存一个图形,相当于保存图形的一些属性,属性有,画图形用到的坐标,比如直线是起始点坐标和终点坐标,每个图形都有的画笔的颜色,宽度,为了方便保存这些属性,我们封装成一个类来保存,因为每个图形的属性都有共同点,我们封装一个抽象父类,要写其他具体图形类只需继承就可以了
//这儿只写直线的代码用来演示,在这段代码中可以看到我们并没有画直线,因为,我们已经把此条直线添加到了list中,下面一行执行repaint()方法将会对list中的所有图形都会重绘一遍,所以就没必要在这儿多画一次了list.add(new ShapeLine(xStart, yStart, xEnd, yEnd, graphics.getColor(), graphics.getStroke()));//将直线添加到list中 repaint();//repaint()这个方法是用来调用paint()方法,促使paint()方法的执行,
//在窗口拖动时,讲list容器中的图形遍历,然后都画出来@Override public void paint(Graphics g) { super.paint(g); for (int i = 0; i < list.size(); i++) { list.get(i).repaint((Graphics2D) g);// 在窗口改变大小的时候重绘,将list中的图形重画一次 } if (shape != null) { shape.repaint((Graphics2D) g);// 显示当前鼠标拖动是画出来的图形 } }
//父类public abstract class Shape { public int x, y, x1, y1, arcWidth, arcHeight;// 画图形需要的一些变量 public Color currentColor;// 画笔的颜色 public Stroke strock;// 设置画笔的宽度 public Shape(int x, int y, int x1, int y1, int arcWidth, int arcHeight, Color currentColor, Stroke strock) { // 圆角矩形的属性赋值 this.x = x; this.y = y; this.x1 = x1; this.y1 = y1; this.arcWidth = arcWidth;// 角弧度的水平直径。 this.arcHeight = arcHeight;// 角弧度的垂直直径。 this.currentColor = currentColor; this.strock = strock; } public Shape(int x, int y, int x1, int y1, Color currentColor, Stroke strock) { // 直线,矩形, this.x = x; this.y = y; this.x1 = x1; this.y1 = y1; this.currentColor = currentColor; this.strock = strock; } public abstract void repaint(Graphics2D g);// 抽象方法,用画笔画图形}//这儿也只演示直线类,继承父类Shapepublic class ShapeLine extends Shape { public ShapeLine(int x, int y, int x1, int y1, Color currentColor, Stroke strock) { super(x, y, x1, y1, currentColor, strock); } // 重绘制直线 @Override public void repaint(Graphics2D g) { g.setColor(currentColor); g.setStroke(strock); g.drawLine(x, y, x1, y1); }}
为了使画图形一目了然,添加了一点效果,拖动的时候显示图形:
- 解决方案:(嘴比较笨,讲解起来不是很容易理解直接看代码)
//还是以直线为例,当然,这效果肯定是在拖动鼠标的时候显示的,所以在鼠标拖动的事件里写的//这一行代码作用:直线起始点不变,就是鼠标按下的哪一点,终点随着鼠标拖动的变化而变化,,然后记录此时起始点和鼠标之间的一条直线,并不是保存在list里面,因为鼠标还在拖动的过程中还没有释放,只是临时的显示出来//shape是一个Shape类型的全局变量,shape = new ShapeLine(xStart, yStart, e.getX(), e.getY(),graphics.getColor(),graphics.getStroke());repaint();//将鼠标拖动时的图形绘制出来,调用paint()方法//在paint()方法中的if语句中就是将鼠标拖动时的图形画出来@Overridepublic void paint(Graphics g) { super.paint(g); for (int i = 0; i < list.size(); i++) { list.get(i).repaint((Graphics2D) g);// 在窗口改变大小的时候重绘,将list中的图形重画一次 } if (shape != null) { shape.repaint((Graphics2D) g);// 显示当前鼠标拖动是画出来的图形 } }
0 0
- Java项目之画图板(三)
- Java项目之画图板(一)
- Java项目之画图板(二)
- java之画图板浅析(一)
- Java制作画图板(未完成)
- JAVA画图板
- java画图板
- 一个功能强大的画图板(三)
- Java基础之简单画图板的实现
- Java制作画图板(阶段二)
- 画图板项目纲要总结
- Java画图板的完善
- JAVA设计画图板
- java,制作简易画图板
- java简单画图板实现
- Java学习总结之坦克大战项目(三)
- 画图板
- 画图板
- C#运算符重载
- LVS环境搭建及图形化管理(Pacemaker管理+heartbeat心跳+ipvs(DR)+ldirector健康检查及转发)
- LINUX FTP简单配置
- 栈的最小值查找(O1)
- I'm faded
- Java项目之画图板(三)
- 12、线性探测法解决散列表保存字典的碰撞问题
- 窗口颜色切换
- 部分java错题
- 网络程序设计课程项目学习总结
- 如何在linux下开启FTP服务
- android ViewStub--布局优化
- 【leetcode】5.Longest Palindromic Substring
- MyEclipse创建maven项目异常