画图板的队列重绘

用数组来实现画图板的重绘,缺陷显而易见,因为数组的长度是固定的,因此我们可以用一种更好的方法来实现重绘,队列。它与数组最大的区别就是,它就是自动增长。接下来是源代码:
第一个类:

/**
* 画图板的面板
*/

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class DrawBorder extends JFrame{
//画图板的属性
private Graphics g;
//创建一个队列类的对象
private link link =new link();
//定义一个Shape类型的变量
private Shape shape;
//定义一个String类型的变量,初始值为line
private String type="line";
private int x1,x2,y1,y2;
//初始化画图板面板的方法
public void showUI(){
this.setTitle("队列重绘的画板实现");
this.setSize(600,500);
//窗口在屏幕的中间
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(3);
//工具面板
JPanel tool_panel=new JPanel();
tool_panel.setPreferredSize(new Dimension(100,300));
tool_panel.setBackground(Color.gray);
this.add(tool_panel,BorderLayout.WEST);
//创建画图面板(内部类的实现)
JPanel DrawPanel=new JPanel(){
//重绘的方法
public void paint(Graphics g){
super.paint(g);
//遍历队列
for(int i=0;i<link.getSize();i++){
//把图形对象取出来
//把Object类型强制转化成Shape类型
((Shape) link.getIndex(i)).draw(g);
}
}

};
DrawPanel.setBackground(Color.white);
DrawPanel.setPreferredSize(new Dimension(400,300));
this.add(DrawPanel,BorderLayout.CENTER);
//创建按钮对象,并添加事件
JButton jbt_line=new JButton("line");
//按钮得到命令
jbt_line.setActionCommand("line");
JButton jbt_rect=new JButton("rect");
jbt_rect.setActionCommand("rect");

//给按钮增加监听器
jbt_line.addActionListener(action_listener);
jbt_rect.addActionListener(action_listener);
//把按钮增加到工具面板上
tool_panel.add(jbt_line);
tool_panel.add(jbt_rect);


this.setVisible(true);
//获取画布(一定要在面板可视之后)
g=DrawPanel.getGraphics();
//给画布增加鼠标监听器
DrawPanel.addMouseListener(mouse_listener);
}
//创建动作监听器
ActionListener action_listener=new ActionListener(){
public void actionPerformed(ActionEvent e){
type=e.getActionCommand();
}
};
//创建鼠标监听器
MouseListener mouse_listener=new MouseAdapter(){
public void mousePressed(MouseEvent e){
x1=e.getX();
y1=e.getY();
}
public void mouseReleased(MouseEvent e){
x2=e.getX();
y2=e.getY();
//判断画图
if(type.equals("line")){
shape=new Line(x1, y1, x2, y2);
}
else if(type.equals("rect")){
shape=new Rect(x1,y1,x2,y2);

}
//画图
shape.draw(g);
//保存图片
link.add(shape);

}
};
}

第二个类:

/**
* 创建一个形状类型的抽象类
*/
import java.awt.Graphics;

public abstract class Shape {
//定义属性
public int x1,x2,y1,y2;
//构造方法
public Shape(int x1,int x2,int y1,int y2){
this.x1=x1;
this.x2=x2;
this.y1=y1;
this.y2=y2;
}
//画图的抽象方法
public abstract void draw(Graphics g);
}


第三个类:

/**
* 新建一个能存储数据的队列
* @author Administrator
*
*/
public class link {
//定义一个长度为0的数组
private Object[] start=new Object[0];

//定义一个队列增加元素的方法
public void add(Object obj){
//定义一个长度为原数组+1的新数组
Object[] end=new Object[start.length+1];
for(int i=0;i<start.length;i++){
end[i]=start[i];
}
end[start.length]=obj;
start=end;
}
//定义一个得到队列长度的方法
public int getSize(){
return start.length;
}
//得到指定索引位置的元素
public Object getIndex(int index){
return start[index];
}
}

第四个类:

import java.awt.Graphics;

/**
* 直线类
* @author Administrator
*
*/
public class Line extends Shape{
public Line(int x1,int x2,int y1,int y2){
//调用父类的方法
super(x1,y1,x2,y2);
}
//画图的抽象方法
public void draw(Graphics g){
g.drawLine(x1, y1, x2, y2);
}
}

第五个类:

import java.awt.Graphics;

public class Rect extends Shape {
public Rect(int x1,int x2,int y1,int y2){
super(x1,y1,x2,y2);
}
public void draw(Graphics g){
g.drawRect(Math.min(x1, x2), Math.min(y1, y2), Math.abs(x1-x2), Math.abs(y1-y2));
}

}


第六个类:
/**
* 主类
* @author Administrator
*
*/
public class Test extends DrawBorder{
public static void main(String agrs[]){
DrawBorder db=new DrawBorder();
db.showUI();
}
}



由上述的代码可以看出,一个这样的画板,需要很多的类来实现,但是每个类的代码不多,这样看起来就会更加的清楚,如果有错误也可以更加好的检查出来,现在只实现了直线和矩形两种功能。。。嘿嘿,继续努力实现吧!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值