仿xp画板的重绘

          首先我们讨论一下,为什么会需要重绘?

          如果没有重绘,当我们将画板最小化,然后再最大化是,你会发现,画板上之前画的内容消失了,这是为什么呢?

         1.你没有将你所化的内容存储起来,这里就需要我之前讲过的数组队列

         2.当你把画板最小化,然后最大化时,相当于重新实例化了一个画布,而旧的画布则被Java中的垃圾回收机制所回收。

         

          那我们如何实现重绘呢?

          有几部我们要先做好:

          1.先建立一个画板

          2.要有一个数组队列(用上一篇中的数组队列即可)

          3.图形抽象类类

          4.具体图形类继承抽象类

          5.图形的存储

 

一.布局:

        我的xp画板用的是流式布局和边界布局还有网格布局,整体用的是流式,分为北,西,中,南。

        而中部放有我的画布,在实现中部时我定义了一个函数create_centerjpanel();而重绘的调用即用匿名内部类的方式的,代码如下:

写道
private JPanel 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
        	}

			@Override
			public 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了,呵呵!!

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值