画图java代码_java入门5--画图程序的实现

画图程序的实现

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

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

它其实就是一个窗体。在窗体上添加事情监听机制就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类,里面调用画笔的各种方法准备重绘。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值