java简易画板
关于画板窗口的实现:
public class DrawFrame extends JFrame//创建的类继承JFrame类
public shape[] shapeArray; //定义的一个shape类
this.setTitle(“绘图工具”);
this.setSize(800, 1000); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLocationRelativeTo(null);
FlowLayout fl = new FlowLayout();
窗口的按钮添加:
JButton ju1 = new JButton(“直线”);
this.add(ju1);
JButton ju2 = new JButton(“矩形”);
this.add(ju2);
JButton ju3 = new JButton(“椭圆”);
this.add(ju3);
窗口添加按钮的大小设置:
JButton red = new JButton();//设置按钮没有名字
red.setBackground(Color.red);//设置按钮的背景颜色
Dimension sz = new Dimension(20,20);//设置尺寸大小
red.setPreferredSize(sz);//将尺寸大小添加到按钮的属性里面去
this.add(red);//在窗口上添加按钮
按钮监听:
ju1.addActionListener(mu);//按钮监听
ju2.addActionListener(mu);
ju3.addActionListener(mu);
red.addActionListener(mu);//按钮监听
green.addActionListener(mu);
blue.addActionListener(mu);
mmoouussee mu = new mmoouussee();//设置监听类
Graphics gg = this.getGraphics();//定义画笔 从当前的窗口上 ,因为当前类继承了JFrame类,因此直接调用 this.getGraphics()方法便可以返回一个画笔,这个画笔用来传递到按钮动作监听类里面去,在动作监听里面根据相应的方法对画笔进行属性设置,并画出相应图形
mu.gr = gg;//将画笔传到监听实现的类里面,在此类里面会用画笔实现图形的绘制
public class mmoouussee implements MouseListener,ActionListener //监听类 继承按钮监听和鼠标监听接口(一个类可以同时继承多个接口,在类中实现接口中的方法,但是一个类只可以继承一个父类)
//按钮监听的方法重写ActionListener接口里面的方法
public void actionPerformed(ActionEvent e) {
//获取按钮上的字符串,在窗口里面当按钮被按下时会调用这个方法
if("".equals(e.getActionCommand()))//如果按下的按钮没有名字 表示是颜色选择按钮{
JButton JB =(JButton)e.getSource();//获取按钮事件源
color = JB.getBackground();//获取按钮背景色
gr.setColor(color); 将画笔的颜色设置为所获取的颜色
}else//如果按下有名字的按钮说明为图形选择按钮 {
name = e.getActionCommand();//获取按钮的名字
//gr.setColor(color.black);
}
//System.out.println("name = "+name);
}
//在鼠标点击按钮完成图形的选择和颜色的选择后,鼠标开始在画布上进行绘制图形,第一次点击下去
public void mousePressed(MouseEvent e) {
System.out.println(“按下”);
x1 = e.getX();//获得第一次点击下去的坐标
y1 = e.getY();
}
//在鼠标松开时 通过判断获取的name 选择化什么图形
public void mouseReleased(MouseEvent e) {
System.out.println(“松开”);
this.x2 = e.getX();//鼠标拖动松开后的坐标
this.y2 = e.getY();
//接下来进行判断,判断点击哪个图形按钮(通过上面actionPerfomed方法所得到的name进行判断)
if(“直线”.equals(name)){
gr.drawLine(x1, y1, x2, y2);
//new shape 将直线的数据保存起来
shape shape = new shape(x1, y1, x2, y2, name, color);//定义了一个shape类用来存储每次画下图形的数据 有坐标和画笔颜色,为了实现重绘
shapp[index++] = shape;//将绘制直线的数据保存到new出来的shape对象里面去,并保存到shape类数组里面去,index++是将数组的下标后移,保证下一次往数组里面存储东西不会将上一次保存的东西所覆盖
//System.out.println(index);
}
if(“矩形”.equals(name)){
// 矩形
gr.drawRect(x1, y1, Math.abs(x2 - x1), Math.abs(y2 - y1));
shape shape = new shape(x1, y1, x2, y2, name, color);
shapp[index++] = shape;
//System.out.println(index);
}
if(“椭圆”.equals(name)) {
gr.fillOval(x1, y1, x2, y2);
//gr.fillOval(x1, y1, x2, y2);
shape shape = new shape(x1, y1, x2, y2, name, color);
shapp[index++] = shape;
//System.out.println(index);
}
}
//以下是实现重绘的代码
public void paint(Graphics g) {
super.paint(g);
for(int i = 0;i<shapeArray.length;i++) {
shape shape = shapeArray[i];
if(shape !=null) {
shape.drawShape(g);
}
}
//定义的shape类,目的是将每一次画图形的数据保存起来
public class shape {
public int x1,y1,x2,y2;//鼠标按下和松开的坐标
public String name;//选择图形按钮的名字
public Graphics gg;//定义的画笔,用来接收窗体上传来的画笔进行图形的绘制
public Color color;//画笔的颜色属性
public shape(int x1,int y1,int x2,int y2,String name,Color color) {//通过构造方法将参数全部初始化
this.color = color;
this.x1 = x1;
this.x2 = x2;
this.y1 = y1;
this.y2 = y2;
this.name = name;
}
//重绘调用的方法
public void drawShape(Graphics gg){
switch (name) {
case “直线”:
//g = gg;
gg.setColor(color);
gg.drawLine(x1, y1, x2, y2);
break;
case “矩形”:
//g = gg;
gg.setColor(color);
gg.drawRect(x1, y1, Math.abs(x2 - x1), Math.abs(y2 - y1));
break;
case “椭圆”:
//Color co = new Color(255,0,0);
//g.setColor(co);
//g = gg;
gg.setColor(color);
gg.fillOval(x1, y1, x2, y2);
break;
}
}
}
*第一次在定义shape类的时候,最后一个属性直接是画笔,然后重绘的时候发现重新绘制图形的颜色全部都是最后一次选择的颜色,最后将画笔这个属性变成颜色后,在调用shape类里面的drawShape方法时,将此时数组里面的颜色属性添到画笔上去,可以绘制出原来的图形和颜色