画图程序的实现

我们之前已经把登陆界面画出来了,而且还加了监听机制。要做一个画图板也用到算是差不多的东西,那么,要怎么做呢?

首先,我们要明确,画图板这个界面是什么?

它其实就是一个窗体。在窗体上添加事情监听机制就OK啦,。这样就能制作一个最简单的画板。然后再一步步使之变复杂,变高级。还有一个问题,画笔是什么呢?它是一个类,叫Graphics画笔类。画笔在哪里呢?要知道我们的所有的窗体呀1,按钮呀其实都是画出来的,那么每个组件上都会有画笔,我们要在哪个组件上面画画,就从哪里得到画笔。

所以,第一步,做一个窗体出来,并且从中得到画笔

public void aa() { // 创建一个aa方法;
DrawListener dr = new DrawListener(); //实例化一个DrawListener的对象,名字是dr;
JFrame jf = new JFrame("普通画图板"); // 实例化窗体对象jf,并给它名字“普通画图板”
jf.setSize(900, 700); // 设置窗体的大小
jf.setLocation(0, 0); // 设置窗体的位置坐标
jf.setDefaultCloseOperation(3); // 设置窗体的开关
Graphics g = jf.getGraphics(); //从窗体得到一个画笔对象,把他实例化
dr.setGraphics((Graphics2D) g);

然后,我们需要实例化MouseListener事件监听机制的一个对象出来,但是!事件接口是没有抽象方法的,无法实例化,那么就无法调用其中的方法了,怎么办呢?

我们可以创建一个类,去继承它,因为前面类与继承那里已经说了,子类能继承父类所有的方法,并且,我们可以把它的方法重写。这样就解决啦。

定义一个DrawListener类

public class DrawListener implements MouseListener
{ //实现(继承)接口
private int x1, x2, y1, y2; // 定义属性名,属性为int private Graphics2D g; // 定义一个画笔的属性名
public void setGraphics(Graphics g) {
this.g = g; //把Draw里面的画笔调用过来,可以在这个类里面使用
public void mouseMoved(MouseEvent e) {} //这是MouseListener里面的方法,虽然暂时不要用,但是继承里所有的父类的方法都要重写
public void mousePressed(MouseEvent e) {
x1 = e.getX();
y1 = e.getY(); //捕捉坐标
}
public void mouseReleased(MouseEvent e) {
x2 = e.getX();
y2 = e.getY();
g.drawLine(x1, y1, x2, y2); //画笔调用画直线的方法
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
}

这样,我们就能制作一个超简单的画板。

然后,它可以一步步升级la。我们可以不仅仅是画直线吗?圆形,矩形,三角形这些都在Graphics画笔的方法里面都有,尝试着写一下吧!

写完之后是不是要建立好多类,一个画直线,一个圆形。。。。。。

或者,把它们写在一个类里面,但是用//划掉,要用哪个的时候删掉//就可以用了

做到这里,肯定就会想,能不能不用这么麻烦,加几个按钮怎么样?

先知道,事件源对象有哪些?窗体,按钮两个

监听接口有哪些?ActionListener(这个是用在按钮上面的)

,MousListener(这个是用在窗体上面的)

要怎么做呢?我们要写条件语句啦:if(){ }

不过,问题又来了,怎么让电脑知道,我1点击的是哪个按钮呢?

这个时候我们就要用到

JButton

jb = (JButton) e.getSource();

这个语句就是提取按钮上的字符

这样,我们可以让点击“直线”的时候画直线,点击“圆形“的按钮时画圆形了

就像这样

public void mouseReleased(MouseEvent e) {

x2 = e.getX();

y2 = e.getY();

if (jb.gettext().equals("直线")) { //获取按钮上的字符并判断

g.drawLine(x1, y1, x2, y2); //画笔调用画直线的方法

}

if (jb.gettext().equals("矩形")) {

g.drawRect(Math.min(x1, x2), Math.min(y1, y2), Math.abs(x1 - x2),

Math.abs(y1 - y2));

}

以此类推,我们就制作出一个画图板啦!

细心的同学应该发现了,画图板是做出来了,但是一旦我们改变一下窗体,如拉一下边缘改变它的大小,里面的图就消失了。这是为什么?

我们知道窗体也是画出来的,当你改变它的一些性质时,它会重写一个窗体,新的窗体上面时没有之前画的图形的。这个时候,我们就要学习,如何把我们画下的图形画在那个新的窗体上了。这就是重绘。

怎么做?

我们要把所有的图形都重绘的话,就一定要记着这些图形的“样子”。比如直线,我们就要记住它的首尾坐标,如果画图板更高级一些,那就有更多数据,这只是一条直线,我们可能画许多条,太多了,不好记。所以,我们要建一个图形类,这个类用来存储数据。建立一个类之后,要怎么存,数组或者数组队列就要被用到了。这个时候,我们要想清楚,用数组存这些x,y等等,还是存直线,曲线一个个图形对象。不用说肯定是存对象啦,这样缩小了好多要存的东西。

我们定义一个Shape【】 shapeArray=new

Shape【100000】;

存好了图形对象,接着就是要重绘了,这时就要用到JFrame里面的重绘方法paint(Graphics g)。这是JFrame类的方法,要怎么使用呢?我们可以继承它,那么就可以重写这个paint方法啦。

public class Draw2 extends Jframe{}

public void paint(){

、super.Paint();

} //用 super调用父类的方法

这样就差不多了,所以,总结一下,我们一共需要3个类,一个画图板的子类那里实现一个画笔以及画各种按钮,还有调用重绘方法,一个时监听类,这里和之前的一样,不过要在画直线,曲线等等之后加一个数组去保存好信息,最后一个是Shape类,里面调用画笔的各种方法准备重绘。