本文主要是介绍仿xp画板的重绘,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
首先我们讨论一下,为什么会需要重绘?
如果没有重绘,当我们将画板最小化,然后再最大化是,你会发现,画板上之前画的内容消失了,这是为什么呢?
1.你没有将你所化的内容存储起来,这里就需要我之前讲过的数组队列
2.当你把画板最小化,然后最大化时,相当于重新实例化了一个画布,而旧的画布则被Java中的垃圾回收机制所回收。
那我们如何实现重绘呢?
有几部我们要先做好:
1.先建立一个画板
2.要有一个数组队列(用上一篇中的数组队列即可)
3.图形抽象类类
4.具体图形类继承抽象类
5.图形的存储
一.布局:
我的xp画板用的是流式布局和边界布局还有网格布局,整体用的是流式,分为北,西,中,南。
而中部放有我的画布,在实现中部时我定义了一个函数create_centerjpanel();而重绘的调用即用匿名内部类的方式的,代码如下:
// 实例化一个底层面板
JPanel jp = new JPanel() {
public void paint(Graphics g) {
// 首先要调用父类的构造方法
super.paint(g);
for (int i = 0; i < Xp_drawListener.list.size(); i++) {
// 实例化一个shape对象并调用子类的draw方法,获取链表的内容并调用draw
Shape s = Xp_drawListener.list.get(i);
s.draw(g);
}
}
};
jp.setBackground(Color.gray);
jp.setLayout(new FlowLayout(FlowLayout.LEFT));
JPanel jp1 = new JPanel();
jp1.setPreferredSize(new Dimension(500, 400));
jp1.setBackground(Color.white);
jp.add(jp1);
this.add(jp, BorderLayout.CENTER);
// 添加中部面板的监听
return jp1;
}
通过这种方式,当每次实例化JPane 时,都会使用匿名内部类重绘我存在list数组中的内容
而画板我简单的实现了画笔,橡皮,画直线,矩形,椭圆,圆,圆矩形,填充等功能。此时我们对每一个图形都需要一个图形类来分别对每一个类的具体怎么画进行定义,这也就是为什么我没有用一个类来实现,而是退而求其次用不同的图形类继承抽象类,来共用公有的属性和方法。
而当我们写子类的时候要注意,子类的构造方法要含有父类的构造方法的参数。
一下我附上部分功能的代码:
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;public class ShapeRoundRect extends Shape{public ShapeRoundRect(int x1, int x2, int y1, int y2, Color color,int width) {super(x1, y1, x2, y2,color, width);// TODO Auto-generated constructor stub}@Overridepublic void draw(Graphics g) {//设置颜色g.setColor(getColor());//强制转换成子类的对象Graphics2D g2 = (Graphics2D)g;g2.setStroke(new BasicStroke(this.getWidth()));System.out.println("圆角矩形");g.drawRoundRect(getX1(), getY1(),getX2()-getX1(),getY2()-getY1(),15, 15);}
}
画笔的方法挺巧妙的,分享一下:
x2 = e.getX();
y2= e.getY();
g.drawLine(x1, y1, x2, y2);
x1 = x2;
y1 = y2;
简简单单的5行代码实现画笔,感觉老NB了,呵呵!!
这篇关于仿xp画板的重绘的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!