java实现画图板功能

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

画图板需要满足的功能有:

画线,画三角形,画矩形,画多边形,画曲线
设置不同颜色的画笔
改变窗口大小或最小化窗口后重新打开时图案不消失

画图方法的编写:

创建一个类,继承JPanel类,重写JPanel的绘制方法,重写方法时写上原有的绘制方法,再添加绘制已有的图形的方法。(为了在改变窗口大小和最小化窗口后再打开时图案不消失)

在画图方法中首先创建一个窗体,设置好各项参数后,将窗体设置边框布局。由于继承了JPanel类,重写的JPanel的绘制方法对于this生效,所以this为画图部分的面板,将this设置背景色为白色,添加到边框布局的中央。再创建一个面板对象(此面板对象用于存放按钮),设置一个背景色并放在边框布局的上方。

由于接下来的按钮和画图面板都需要监听器,于是创建Listener类。Listener类实现ActionListener,MouseListener,MouseMotionListener的接口。Listener类需要重写这些监听器接口的所有方法。

创建字符串数组存放画图形状的名称,接着使用for循环,将字符串添加到各个按钮上,再将按钮添加到面板对象中,最后再给按钮加上按钮监听器;接着再创建颜色类的数组存放各种颜色,同样使用for循环,将颜色设置成按钮的背景色,再将按钮添加到边框布局上方的面板对象中,再给按钮添加监听器。最后再在面板上获取画笔并添加上鼠标监听器。

package draw0924;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class drawframe extends JPanel{
public static void main(String[] args) {
 drawframe dr=new drawframe();
 dr._draw();
}
private Shape[] shape;
public void _draw() {
 JFrame jf=new JFrame();
 jf.setSize(800,800);
 jf.setTitle("画图窗口");
 jf.setLocationRelativeTo(null);
 jf.setDefaultCloseOperation(3);
 jf.setLayout(new BorderLayout());//设置边框布局
 JPanel panel=new JPanel();//创建一个面板对象
 panel.setBackground(Color.GREEN);
 jf.add(panel,BorderLayout.NORTH);//添加到边框布局的上方
 Listener butt=new Listener();//创建监听器类,并创建一个监听器对象
 String[] str= {"画线","画三角形","画矩形","画多边形","画曲线"};//创建字符串数组存储按钮文字
 for(int i=0;i<str.length;i++) {
 JButton jbu=new JButton(str[i]);//创建按钮对象并把按钮文字添加上
 panel.add(jbu);//将按钮添加到面板对象上
 jbu.addActionListener(butt);//给按钮添加监听器
 }
 Color[] color= {Color.RED,Color.BLUE,new Color(104,150,144)};//创建颜色数组存储画笔颜色
 for(int i=0;i<color.length;i++) {
 JButton jbu=new JButton();//创建按钮对象
 jbu.setBackground(color[i]);//将按钮背景设置颜色
 panel.add(jbu);//将按钮添加到面板对象上
 jbu.setPreferredSize(new Dimension(30,30));//设置按钮大小
 jbu.addActionListener(butt);//给按钮添加监听器
 }
 this.setBackground(Color.WHITE);//将继承来的面板设置背景色
 jf.add(this,BorderLayout.CENTER);//将此面板添加到边框布局的中央
 jf.setVisible(true);
 Graphics g=this.getGraphics();//在要绘画的面板上获取画笔(要在窗口可视化之后)
 butt.setg(g);//将画笔传入监听器
 this.addMouseListener(butt);//给要绘画的面板添加鼠标监听器
 this.addMouseMotionListener(butt);//给要绘制的面板添加鼠标监听器
 shape=butt.get();//将监听器内保存的图形保存到此类的全局变量中
}
public void paint(Graphics g) {
 super.paint(g);//父类的绘画方法
 for(int i=0;i<shape.length;i++) {
 if(shape[i]!=null) {
 shape[i].drawshape(g);//图形的绘画
 }
 }
}
}

监听器方法的重写:

首先是点击按钮监听方法的重写:获取按钮上的字符串,如果是空字符串则将监听器内的画笔颜色设置为按钮颜色,如果是绘图方法的字符串(用于以下的监听方法中判断执行绘画方法),并将全局变量i重置为0(在切换画图方法时可重置数据)。

画线方法:若字符串为画线,则在鼠标按压监听方法中获取鼠标按压下的坐标点x,y并赋值给全局变量x1,y1;在鼠标释放监听方法中获取鼠标释放的坐标点x,y并赋值给全局变量x2,y2。再用画笔对象调用画线方法,将x1,y1,x2,y2参数传入画出线段。最后保存画图形状,x1,y1,x2,y2和画笔颜色的数据到Shape类中的shape数组。(Shape类在后面说明)。

画三角形方法:若字符串为画三角形,且全局变量i=0(判断是否为画三角形的第一步),则在鼠标按压监听方法中获取鼠标按压下的坐标点x,y并赋值给全局变量x1,y1;在鼠标释放监听方法中获取鼠标释放的坐标点x,y并赋值给全局变量x2,y2。再用画笔对象调用画线方法,将x1,y1,x2,y2参数传入画出线段同时将i++(避免之后的点击动作重置x1,y1和x2,y2)。接着在鼠标点击方法中获取鼠标点击的坐标点x,y并赋值给全局变量x3,y3,再用画笔对象调用画线方法,分别画出该点与线段两个端点的连线,再将i重置为0(为画下一个三角形做准备)。最后再保存图形的相应数据到shape数组。

画矩形方法:若字符串为画矩形,则在鼠标按压监听方法中获取鼠标按压下的坐标点x,y并赋值给全局变量x1,y1;在鼠标释放监听方法中获取鼠标释放的坐标点x,y并赋值给全局变量x2,y2。再用画笔对象调用画矩形方法,传入参数x1,x2中较小的数,y1,y2中较小的数(较小的数作为矩形的左上方点的坐标),x1-x2的绝对值(矩形长度),y1-y2的绝对值(矩形高度)。最后再保存图形的相应数据到shape数组。

画多边形方法:若字符串为画多边形,且全局变量i=0(判断是否为画多边形的第一步),则在鼠标按压监听方法中获取鼠标按压下的坐标点x,y并赋值给全局变量x1,y1;在鼠标释放监听方法中获取鼠标释放的坐标点x,y并赋值给全局变量x2,y2。再用画笔对象调用画线方法,将x1,y1,x2,y2参数传入画出线段并保存这条线段的数据同时将i++(避免之后的点击动作重置x1,y1和x2,y2)。接着在鼠标点击方法中获取鼠标点击的坐标点x,y并赋值给全局变量x3,y3,再用画笔对象调用画线方法,画出x2,y2与x3,y3的连线同时保存这条线段的数据,接着将x3,y3赋值给x2,y2(为画下一条连线做准备)。同时设置若双击则将此点和x1,y1连接并保存这条线段的数据,最后再将i重置为0(为画下一个多边形做准备)。

画曲线方法:若字符串为画曲线,则在鼠标按压监听方法中获取鼠标按压下的坐标点x,y并赋值给全局变量x1,y1,再在鼠标拖拽方法中获取鼠标所在点的坐标x2,y2,并用画笔对象调用画线方法,将x1,y1,x2,y2参数传入画出线段同时保存这条线段的数据。再将x2,y2赋值给x1,y1。

最后再添加获取面板画笔的方法和返回shape数组的方法(在外部使用)。

package draw0924;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;

import javax.swing.JButton;

public class Listener implements ActionListener,MouseListener,MouseMotionListener{

 private Graphics g;int x1,y1,x2,y2,x3,y3,i=0,j=0;String str;Shape[] shape=new Shape[10000];
 public Shape[] get() {
 return shape;//返回保存的图形数组
 }
 public void setg(Graphics g) {
 this.g=g;//获取外部画笔
 }
 public void actionPerformed(ActionEvent e) {
 if("".equals(e.getActionCommand())) {
 JButton jb=(JButton)e.getSource();
 Color color=jb.getBackground();
 g.setColor(color);//若为颜色按钮则设置画笔颜色
 }
 else {
 str=e.getActionCommand();//若为绘画方法按钮则获取按钮上字符串
 i=0;//切换绘画方法时重置数据
 }
 }

 @Override
 public void mouseDragged(MouseEvent e) {
 if(str=="画曲线") {
 x2=e.getX();
 y2=e.getY();
 g.drawLine(x1,y1,x2,y2);
 shape[j++]=new Shape("画曲线",x1,y1,x2,y2,0,0,g.getColor());
 x1=x2;
 y1=y2;
 }
 }

 @Override
 public void mouseMoved(MouseEvent e) {
 // TODO Auto-generated method stub

 }

 @Override
 public void mouseClicked(MouseEvent e) {
 if("画三角形"==str) {
 x3=e.getX();
 y3=e.getY();
 g.drawLine(x1, y1, x3, y3);
 g.drawLine(x2, y2, x3, y3);
 i=0;//为画下一个三角形做准备
 shape[j++]=new Shape("画三角形",x1,y1,x2,y2,x3,y3,g.getColor());
 }
 if("画多边形"==str) {
 x3=e.getX();
 y3=e.getY();
 g.drawLine(x3, y3, x2, y2);
 shape[j++]=new Shape("画多边形",x2,y2,x3,y3,0,0,g.getColor());
 x2=x3;
 y2=y3;
 if(e.getClickCount()==2) {
 g.drawLine(x1, y1, x2, y2);
 shape[j++]=new Shape("画多边形",x1,y1,x2,y2,0,0,g.getColor());
 i=0;//为画下一个多边形做准备
 }
 }
 }

 @Override
 public void mousePressed(MouseEvent e) {
 if("画线"==str) {
 x1=e.getX();
 y1=e.getY();
 }
 if("画三角形"==str) {
  //判断为画三角形的第一步
 if(i==0) {
 x1=e.getX();
 y1=e.getY();
 }
 }
 if("画矩形"==str) {
 x1=e.getX();
 y1=e.getY();
 }
 if("画多边形"==str) {
  //判断为画多边形的第一步
 if(i==0) {
 x1=e.getX();
 y1=e.getY();
 }
 }
 if("画曲线"==str) {
 x1=e.getX();
 y1=e.getY();
 }
 }

 @Override
 public void mouseReleased(MouseEvent e) {
 if("画线"==str) {
 x2=e.getX();
 y2=e.getY();
 g.drawLine(x1,y1,x2,y2);
 shape[j++]=new Shape("画线",x1,y1,x2,y2,0,0,g.getColor());
 }
 if("画三角形"==str) {
  //判断为画三角形的第一步
 if(i==0) {
 x2=e.getX();
 y2=e.getY();
 g.drawLine(x1,y1,x2,y2);
 i++;//避免在点击时重置已有的坐标值
 }
 }
 if("画矩形"==str) {
 x2=e.getX();
 y2=e.getY();
 g.drawRect(Math.min(x1, x2), Math.min(y1, y2), Math.abs(x1-x2), Math.abs(y1-y2));
 shape[j++]=new Shape("画矩形",x1,y1,x2,y2,0,0,g.getColor());
 }
 if("画多边形"==str) {
 //判断为画多边形的第一步
 if(i==0) {
 x2=e.getX();
 y2=e.getY();
 g.drawLine(x1,y1,x2,y2);
 i++;//避免在点击时重置已有的坐标值
 shape[j++]=new Shape("画多边形",x1,y1,x2,y2,0,0,g.getColor());
 }
 }
 }

 @Override
 public void mouseEntered(MouseEvent e) {
 // TODO Auto-generated method stub

 }

 @Override
 public void mouseExited(MouseEvent e) {
 // TODO Auto-generated method stub

 }

}

创建Shape类保存图形的形状,大小和颜色等各项数据。

package draw0924;

import java.awt.Color;
import java.awt.Graphics;

public class Shape {
 private String name;
 private int x1,y1,x2,y2,x3,y3;
 private Color m;
 public Shape(String name,int x1,int y1,int x2,int y2,int x3,int y3,Color m) {
 this.name=name;
 this.x1=x1;
 this.x2=x2;
 this.y1=y1;
 this.y2=y2;
 this.x3=x3;
 this.y3=y3;
 this.m=m;
 }
 public void drawshape(Graphics g) {
 g.setColor(m);
 switch(name) {
 case "画线":
 g.drawLine(x1,y1, x2, y2);
 break;
 case "画三角形":
 g.drawLine(x1, y1, x2, y2);
 g.drawLine(x1, y1, x3, y3);
 g.drawLine(x3, y3, x2, y2);
 break;
 case "画矩形":
 g.drawRect(Math.min(x1, x2), Math.min(y1, y2), Math.abs(x1-x2), Math.abs(y1-y2));
 break;
 case "画多边形":
 g.drawLine(x1,y1, x2, y2);
 break;
 case "画曲线":
 g.drawLine(x1,y1, x2, y2);
 break;
 }
 }
}

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

(0)

相关推荐

  • 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实现画图板功能

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

  • 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实现简易画图板

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

  • Java 实现随机验证码功能简单实例

    Java 实现随机验证码功能简单实例 现在许多系统的注册.登录或者发布信息模块都添加的随机码功能,就是为了避免自动注册程序或者自动发布程序的使用. 验证码实际上就是随机选择一些字符以图片的形式展现在页面上,如果进行提交操作的同时需要将图片上的字符同时提交,如果提交的字符与服务器session保存的不同,则认为提交信息无效.为了避免自动程序分析解析图片,通常会在图片上随机生成一些干扰线或者将字符进行扭曲,增加自动识别的难度. 在这里,我们使用servlet来实现随机验证码的实现.  实现代码: p

  • 使用Python编写简单的画图板程序的示例教程

    从这次开始,我会由简单到困难(其实也不会困难到哪里去)讲几个例程,每一个例程都是我自己写(或者修改,那样的话我会提供原始出处)的,都具有一定的操作性和娱乐性.例程中汇尽量覆盖到以前所讲的pygame中方方面面,如果看到哪一步不明白,那就再回去复习复习,基本没有人会看一遍什么都记住什么都掌握的,重复是学习之母,实践是掌握一门技艺的最好手段! 这次就先从一个最简单的程序开始,说实话有些太简单我都不好意思拿出手了,不过从简单的开始,容易建立自信培养兴趣.兴趣是学习之母嘛.我们这次做一个画板,类似Win

  • Android 自定义view之画图板实现方法

    看效果: 中间一个画图板 上方小控件用来显示实时画出的图形 下方小控件用来做一些画图的控制 2个小控件都能移动 顺带还有一个刮刮卡效果,只需要改一个参数: 自定义view首先要自定义属性: 在values下面创建attrs.xml: <!--画图板--> <declare-styleable name="DrawImg"> <attr name="PaintColor" /> //画笔颜色 <attr name="

  • C#实现简易画图板的示例代码

    编程环境 VS2019.C# 画板功能演示 实现简单画图 打开功能 可打开jpg格式的文件 保存功能 可将绘画的内容保存为jpg文件 颜色选择功能 用户可自由选择所需的颜色 粗细选择功能 提供四种型号的画笔供用户选择 清空画布功能 点击清空后提示是否清空 选择确定则将画布清空,效果如下图所示 功能实现过程 定义公共变量 用于多个窗体之间共同使用数据 public class TempData { //用于多个窗体共同使用的数据 public static int size=5; public s

随机推荐