基于java实现画图板功能

本文实例为大家分享了java实现画图板功能的具体代码,供大家参考,具体内容如下

一、介绍

这个画图板主要实现的功能是画矩形(矩形使用的是一个函数画图的方法,这样画出来的图形比较有特点)、椭圆、多变形(先画一条直线,鼠标每点击一个地方就会从上一个点连接到点击的点,当鼠标双击时,双击的点会和终点和起点相连)、画线、橡皮以及颜色选择器,效果图如下所示:

二、具体实现

本项目主要使用的是java.swing以及java.awt的画图工具来实现。首先显示窗口的建立,先让主类draw继承javax.swing.JFrame。draw.java的代码如下:

public class draw extends JFrame{

    private Shape shape[]= new Shape[100000];//将所画的形状存储在shape数组中
    public static void main(String[] args) {
        draw simpleDraw = new draw();
        simpleDraw.showUI();//调用showUI()函数

    }
    public void showUI() {
        drawlistener drawListener = new drawlistener();
        
        
        java.awt.FlowLayout flowLayout = new FlowLayout();
        JButton jb1=new JButton("矩形");//添加一个叫“矩形”的按钮
        JButton jb2=new JButton("椭圆");
        JButton jb3=new JButton("多边形");
        JButton jb4=new JButton("三角形");
        JButton jb5=new JButton("画线");
        JButton jb6=new JButton("橡皮");
        java.awt.Dimension dimension = new Dimension(100, 30);
        jb1.setPreferredSize(dimension);//设置按钮的位置
        jb2.setPreferredSize(dimension);
        jb3.setPreferredSize(dimension);
        jb4.setPreferredSize(dimension);
        jb5.setPreferredSize(dimension);
        jb6.setPreferredSize(dimension);
        this.add(jb1);//在这个窗口上添加按钮
        this.add(jb2);
        this.add(jb3);
        this.add(jb4);
        this.add(jb5);
        this.add(jb6);
        Color []colors= {Color.BLUE,Color.GRAY,Color.YELLOW,Color.BLACK};//提供四种颜色选择,存储在colors数组中
        for(int i=0;i<4;i++) {//新建4个颜色选择的按钮
            JButton jButton=new JButton();
            jButton.setBackground(colors[i]);
            jButton.setPreferredSize(new Dimension(30, 30));
            this.add(jButton);//在这个窗口上添加次按钮
            jButton.addActionListener(drawListener);//设置按钮的位置
        }
        
        this.setLayout(flowLayout);//设置窗口布局
        this.setSize(800, 700);//设置窗口大小
        this.setTitle("画板");//设置窗口名称
        this.setLocationRelativeTo(null);//设置窗口位置
        this.setDefaultCloseOperation(3);
        this.setVisible(true);
        this.getContentPane().setBackground(Color.white);//设置窗口背景颜色
        
        
        this.addMouseMotionListener(drawListener);//窗口添加监听
        jb1.addActionListener(drawListener);//按钮添加监听
        jb2.addActionListener(drawListener);
        jb3.addActionListener(drawListener);
        jb4.addActionListener(drawListener);
        jb5.addActionListener(drawListener);
        jb6.addActionListener(drawListener);
        //-----------------
        java.awt.Graphics g = this.getGraphics();//在此窗口上获得画笔
        
        drawListener.setGr(g);//将画笔传给监听器drawListener
        drawListener.setShape(shape);//将数组传给监听器drawListener
        this.addMouseListener(drawListener);//画布添加监听
        
        
    }
    public void paint(Graphics g) {//重绘
        super.paint(g);
        for(int i=0;i<shape.length;i++) {//重绘shape数组中的所有图形
            Shape shape1=shape[i];
            if(shape1!=null) {
                shape1.drawShape(g);
            }else
                break;
        }
    }
}

上述代码中showUI()函数是画图板的界面,drawlistener drawListener = new drawlistener();是调用drawlistener.java新建一个drawlistener类。
在项目进行的过程中,将窗口最小化或者改变窗口大小时,我们先前画的东西就全部消失了。这是因为当窗体在屏幕上显示的时候,首先是将窗体对象的数据从内存中取出来放到缓存中,再在屏幕上进行绘制。当窗体发生改变的时候,程序就会重新从内存中获取更新后的数据绘制。**在系统中Jframe的父类中提供有一个paint(Graphics g)的方法来负责将窗口数据在屏幕上绘制出来。**所以我重写了paint(Graphics g)方法,先将画过的图形存储在一个shape数组中,然后在paint(Graphics g)方法中将所有图形重新画出来,代码:

public void paint(Graphics g) {//重绘
        super.paint(g);
        for(int i=0;i<shape.length;i++) {//重绘shape数组中的所有图形
            Shape shape1=shape[i];
            if(shape1!=null) {
                shape1.drawShape(g);
            }else
                break;
        }
    }

drawlistener.java代码如下:

public class drawlistener implements MouseListener,ActionListener,MouseMotionListener{

    private int x1,x2,y1,y2,x3,y3,a,b,x4,y4;
    private Graphics gr;    
    private int flag=1;
    String name;
    Shape shapeLarry[];
    int index;
    Color c=Color.BLACK;

    
    public void setShape(Shape shape[]) {//传入shape数组
        this.shapeLarry=shape;
    }
    public void setGr(Graphics graphics) {//传入画笔
        gr=graphics;
    }

    public void mouseClicked(MouseEvent e) {//重写鼠标点击函数mouseClicked(MouseEvent e)
        x3=e.getX();//获取鼠标x坐标
        y3=e.getY();//获取鼠标y坐标
        if("多边形".equals(name)) {//如果点击多边形按钮
            if(flag == 2) {//如果是第一次画
                //gr.drawLine(x3, y3, x1, y1);
                gr.drawLine(x3, y3, x2, y2);
                Shape shape=new Shape(x3, x2, y3, y2, name);
                shape.setColor(c);
                shapeLarry[index++]=shape;
                a=x3;
                b=y3;
                flag++;
            }
            
            if(flag==3) {//如果不是第一次画
                gr.drawLine(x3, y3, a, b);
                Shape shape=new Shape(x3, a, y3, b, name);
                shape.setColor(c);
                shapeLarry[index++]=shape;
                a=x3;
                b=y3;
            }
            
            if(e.getClickCount()==2) {//如果双击,连接起点终点
                gr.drawLine(x3, y3, x1, y1);
                Shape shape=new Shape(x3, x1, y3, y1, name);
                shape.setColor(c);
                shapeLarry[index++]=shape;
                gr.drawLine(x3, y3, a, b);
                
                flag-=2;
            }
        }
        if("三角形".equals(name)) {//如果点击三角形按钮
            if(flag==2) {//如果不是第一次画,连接两端
                gr.drawLine(x3, y3, x1, y1);
                Shape shape=new Shape(x1, x3, y1, y3, name);
                shape.setColor(c);
                shapeLarry[index++]=shape;
                gr.drawLine(x3, y3, x2, y2);
                Shape shape2=new Shape(x2, x3, y2, y3, name);
                shape2.setColor(c);
                shapeLarry[index++]=shape2;
                flag--;
            }
        }
        System.out.println("flag="+flag);
        
    }

    public void mousePressed(MouseEvent e) {//重写鼠标持续点击函数mousePressed(MouseEvent e)
        if(flag == 1) {
            x1=e.getX();
            y1=e.getY();
        }
        
        
    }

    
    public void mouseReleased(MouseEvent e){//重写鼠标释放函数mouseReleased(MouseEvent e)
        if(flag==1) {
            x2=e.getX();
            y2=e.getY();
        }

        if("矩形".equals(name)) {//使用函数画图
            for(int i=0;i<25500;i++) {
                gr.setColor(new Color(i/100, (i+12)/100, 12));
                if((i+12)/100>=225) {
                    for(int i2=i;i2<30000;i2++) {
                        gr.setColor(new Color(i/100, (i+12)/100, 12));
                        if((Math.abs(x2-x1)-i2/50)<=0||(Math.abs(y2-y1)-i2/50)<=0)
                            break;
                        gr.drawRect(Math.min(x1, x2), Math.min(y1, y2), Math.abs(x2-x1)-i2/50, Math.abs(y2-y1)-i2/50);
                        
                    }
                    break;
                }
                gr.drawRect(Math.min(x1, x2), Math.min(y1, y2), Math.abs(x2-x1)-i/50, Math.abs(y2-y1)-i/50);
            }
            Shape shape= new Shape(x1, x2, y1, y2, name);
            shapeLarry[index++]=shape;
            //gr.drawRect(Math.min(x1, x2), Math.min(y1, y2), Math.abs(x2-x1), Math.abs(y2-y1));
        }
        if("椭圆".equals(name)) {//当鼠标释放时画椭圆
            gr.drawOval(Math.min(x1, x2), Math.min(y1, y2), Math.abs(x2-x1), Math.abs(y2-y1));
            Shape shape=new Shape(x1, x2, y1, y2, name);
            shape.setColor(c);
            shapeLarry[index++]=shape;
        }
        if("多边形".equals(name) && flag==1) {//当鼠标释放时且不是最后一次画时画直线
            gr.drawLine(x1, y1, x2, y2);
            Shape shape=new Shape(x1, x2, y1, y2, name);
            shape.setColor(c);
            shapeLarry[index++]=shape;
            flag++;
        }
        if("三角形".equals(name) && flag==1) {
            gr.drawLine(x1, y1, x2, y2);    
            Shape shape=new Shape(x1, x2, y1, y2, name);
            shape.setColor(c);
            shapeLarry[index++]=shape;
            flag++;
        }
        if("橡皮".equals(name)) {
            Graphics2D graphics2d=(Graphics2D) gr;
            BasicStroke basicStroke=new BasicStroke(1f);
            graphics2d.setColor(c);
            graphics2d.setStroke(basicStroke);
        }
        System.out.println("flag="+flag);
    }
    public void actionPerformed(ActionEvent e) {
        if("".equals(e.getActionCommand())) {
            JButton jb=(JButton)e.getSource();
            c=jb.getBackground();
            gr.setColor(c);
        }else if("多边形".equals(e.getActionCommand())==false ||"三角形".equals(e.getActionCommand())==false){
            flag=1;
            name=e.getActionCommand();
        }else {
            
            name=e.getActionCommand();
        }

    }

    
    public void mouseDragged(MouseEvent e) {//重写鼠标拖拽函数mouseDragged(MouseEvent e)
        x4=e.getX();
        y4=e.getY();
        if("画线".equals(name)) {//画线主要是下一个点和上一个点连线组成
            
            gr.drawLine(x1, y1,x4, y4);
            Shape sh=new Shape(x4, y4, name, x1, y1);
            sh.setColor(c);
            shapeLarry[index++]=sh;
            x1=x4;
            y1=y4;
            
        }
        if("橡皮".equals(name)) {
            Graphics2D graphics2d=(Graphics2D) gr;
            BasicStroke basicStroke=new BasicStroke(10f);
            graphics2d.setColor(Color.WHITE);
            graphics2d.setStroke(basicStroke);
            gr.drawLine(x1, y1,x4, y4);
            Shape she=new Shape(x4, y4, name, x1, y1);
            she.setColor(Color.white);
            shapeLarry[index++]=she;
            x1=x4;
            y1=y4;
        }
        if("矩形".equals(name)) {
            
            gr.drawRect(Math.min(x1, x4), Math.min(y1, y4), Math.abs(x4-x1), Math.abs(y4-y1));
            gr.setColor(Color.white);
            gr.drawRect(Math.min(x1, a), Math.min(y1, b), Math.abs(a-x1), Math.abs(b-y1));
            gr.setColor(Color.black);
            a=x4;
            b=y4;
        }
    }

}

Shape.java代码如下:

public class Shape {
    private int x1,x2,y1,y2,x3,y3,x4,y4,a,b;
    String name;
    Color c1;
    
    public Shape(int x1,int x2,int y1,int y2,String name) {
        this.x1=x1;
        this.x2=x2;
        this.y1=y1;
        this.y2=y2;
        this.name=name;
    }
    public Shape(int x4,int y4,String name,int x1,int y1) {
        this.x1=x1;
        this.y1=y1;
        this.x4=x4;
        this.y4=y4;
        this.name=name;
    }
    
    public void setColor(Color c) {
        this.c1=c;
        
    }
        
    public void drawShape(Graphics g){
        g.setColor(c1);
        switch (name) {
        case "矩形":
            for(int i=0;i<25500;i++) {
                g.setColor(new Color(i/100, (i+12)/100, 12));
                if((i+12)/100>=225) {
                    for(int i2=i;i2<30000;i2++) {
                        g.setColor(new Color(i/100, (i+12)/100, 12));
                        if((Math.abs(x2-x1)-i2/50)<=0||(Math.abs(y2-y1)-i2/50)<=0)
                            break;
                        g.drawRect(Math.min(x1, x2), Math.min(y1, y2), Math.abs(x2-x1)-i2/50, Math.abs(y2-y1)-i2/50);
                        
                    }
                    break;
                }
                g.drawRect(Math.min(x1, x2), Math.min(y1, y2), Math.abs(x2-x1)-i/50, Math.abs(y2-y1)-i/50);
            }
            break;
            
        case "椭圆":
            Graphics2D graphics2d4=(Graphics2D) g;
            BasicStroke basicStroke4=new BasicStroke(1f);
            graphics2d4.setColor(c1);
            graphics2d4.setStroke(basicStroke4);
            
            g.drawOval(Math.min(x1, x2), Math.min(y1, y2), Math.abs(x2-x1), Math.abs(y2-y1));
            break;
        case "画线":
            Graphics2D graphics2d=(Graphics2D) g;
            BasicStroke basicStroke=new BasicStroke(1f);
            graphics2d.setColor(c1);
            graphics2d.setStroke(basicStroke);
            
            g.drawLine(x1, y1, x4, y4);
            break;
        case "橡皮":
            Graphics2D g2D=(Graphics2D)g;
            BasicStroke basicStroke2=new BasicStroke(10f);
            g2D.setColor(Color.WHITE);
            g2D.setStroke(basicStroke2);
            
            g2D.drawLine(x1, y1,x4, y4);
            break;
        case "三角形":
            Graphics2D graphics2d1=(Graphics2D) g;
            BasicStroke basicStroke1=new BasicStroke(1f);
            graphics2d1.setColor(c1);
            graphics2d1.setStroke(basicStroke1);
            
            g.drawLine(x1, y1, x2, y2);
            //g.drawLine(x3, y3, x1, y1);
            //g.drawLine(x3, y3, x2, y2);
            break;
        case "多边形":
            Graphics2D graphics2d2=(Graphics2D) g;
            BasicStroke basicStroke3=new BasicStroke(1f);
            graphics2d2.setColor(c1);
            graphics2d2.setStroke(basicStroke3);
            
            g.drawLine(x1, y1, x2, y2);
            break;
        default:
            break;
        }
    }
}

shape类主要是用来存储画过的图形而定义的类型,将图形存储在shape类型的数组中就不会出现所画的图形消失的情况了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • java实现画图板功能

    本文实例为大家分享了java实现画图板的具体代码,供大家参考,具体内容如下 画图板需要满足的功能有: 画线,画三角形,画矩形,画多边形,画曲线 设置不同颜色的画笔 改变窗口大小或最小化窗口后重新打开时图案不消失 画图方法的编写: 创建一个类,继承JPanel类,重写JPanel的绘制方法,重写方法时写上原有的绘制方法,再添加绘制已有的图形的方法.(为了在改变窗口大小和最小化窗口后再打开时图案不消失) 在画图方法中首先创建一个窗体,设置好各项参数后,将窗体设置边框布局.由于继承了JPanel类,重

  • Java实现简易画图板

    本文实例为大家分享了Java实现简易画图板的具体代码,供大家参考,具体内容如下 这是Windows系统自带的画图板,我们就是模仿着用Java去写一个简易版的画图板. 效果图 图中的四个颜色按钮是可以配合要画的图形而改变线条颜色的,而且每次打开颜色按钮的颜色都是随机的.目前画图什么的都没什么问题,只是一些细节没有去完全修复了,但不影响使用,再加上近段时间有点太忙,就没有去完善相关细节了,有兴趣的小伙伴可以评论区帮忙提出指正意见哈. 画图板UI界面代码 import java.awt.Color;

  • java实现画图板上画一条直线

    目标:在画图板上画一条直线,供大家参考,具体内容如下 一.首先需要建立一个界面 过程:1.创建界面对象(Java语言中已经有,可直接创建对象来使用). 2.对于一个界面,我们需要设置它的大小.居中.界面关闭.界面可见. 3.写主方法去实现界面. (目前界面还未实现画图板的功能) public class DrawUI { //显示界面的方法 public void show(){ //创建界面对象 JFrame jframe = new JFrame(); //设置界面的尺寸.位置居中.关闭.标

  • Java实现的简单画图板示例

    本文实例讲述了Java实现的简单画图板.分享给大家供大家参考,具体如下: 这个画图板是我好久之前做的,之后浙大的同学需要做课设然后就花了一点时间将它改了一下,变得简单些能够方便扩充功能,同时学习java基础 先截图一下吧,就可以知道有哪些功能了~ 三个分区,上面选择图形,下面选择颜色,立体圆就是一个分形,也先放着不需要的同学可以注释了它 代码很简单,就是JPanel进行分区,得到画笔,同时使用画图的函数就可以做到了 贴代码应该很快就会了~ 主类 package awtDemo; import j

  • 基于java实现画图板功能

    本文实例为大家分享了java实现画图板功能的具体代码,供大家参考,具体内容如下 一.介绍 这个画图板主要实现的功能是画矩形(矩形使用的是一个函数画图的方法,这样画出来的图形比较有特点).椭圆.多变形(先画一条直线,鼠标每点击一个地方就会从上一个点连接到点击的点,当鼠标双击时,双击的点会和终点和起点相连).画线.橡皮以及颜色选择器,效果图如下所示: 二.具体实现 本项目主要使用的是java.swing以及java.awt的画图工具来实现.首先显示窗口的建立,先让主类draw继承javax.swin

  • 基于Java实现收发电子邮件功能

    目录 前言 邮件协议 1.首先在邮箱中开启此服务 2.在Java中进行邮件的发送(邮件只包含文本) 3.在Java中进行邮件的发送(邮件包含文本和附件(图片)) 前言 Email就是电子邮件,我们平常使用的QQ邮箱,网易邮箱,Foxmail都是用来收发邮件的,利用Java程序也可以完成收发电子邮件的功能. 传统的邮件是通过邮局投递,从一个邮局到另一个邮局,最终到达用户的邮箱.电子邮件与之的发送过程是类似的.电子邮件是从用户电脑的邮件软件(例如:Outlook),发送到邮件服务器上,可能经过若干个

  • Java读取文件及基于正则表达式的获取电话号码功能详解

    本文实例讲述了Java读取文件及基于正则表达式的获取电话号码功能.分享给大家供大家参考,具体如下: 1.正则表达式 正则表达式,又称 正规表示法 . 常规表示法 (英语:Regular Expression,在代码中常简写为regex.regexp或RE),计算机科学的一个概念.正则表达式使用单个字符串来描述.匹配一系列符合某个句法规则的字符串.在很多文本编辑器里,正则表达式通常被用来检索.替换那些符合某个模式的文本. 用到的一些特殊构造正则表达式的意义解析: ? 当该字符 紧跟在任何一个其他限

  • Java基于堆结构实现优先队列功能示例

    本文实例讲述了Java基于堆结构实现优先队列功能.分享给大家供大家参考,具体如下: package Demo; import java.util.NoSuchElementException; /* * 小顶堆 java使用堆结构实现优先队列 */ public class JPriorityQueue<E> { @SuppressWarnings("hiding") class QueueNode<E> { int capacity; int size; E[

  • Java实现画线、矩形、椭圆、字符串功能

    本文讲述了Java实现画线.矩形.椭圆.字符串功能的实例代码.分享给大家供大家参考,具体如下: import java.awt.Frame; import java.awt.Graphics; import java.awt.Image; import java.awt.Toolkit; /** * 增加窗口 画线.矩形.椭圆.字符串 * @author Lixiangjian * */ public class BallGame extends Frame{ //Image sun 代表所得到

  • Java基于Tcp的基础聊天功能实例

    本文实例讲述了Java基于Tcp的基础聊天功能.分享给大家供大家参考,具体如下: 最基础的聊天,用户端和服务器端每次说一句,而且严格规定了先后到顺序. 服务器端: import java.io.*; import java.net.*; public class ChatServer { public static void main(String[] args) { ServerSocket server = null; try { server = new ServerSocket(1213

  • Java实战之基于swing的QQ邮件收发功能实现

    一.电子邮件详解 假设自己的电子邮件是me@163.com,对方的邮件是you@163.com 我们编写好文件填写好对方文件,点击发送,这些电子邮件就发出去了 而这些电子邮件被称为MUA:Mail User Agent--邮件用户代理. Email发送出去的时候,不是直接到达对方的电脑,而是先发送到MTA:Mail Transfer Agent--邮件传输代理.如:网易 Email到达MTA后,MTA会把Emain投递到邮件的最终目的MDA:Mail Delivery Agent--邮件投递代理

随机推荐