一个简单的画板应用程序,用户可以通过鼠标在画板上自由绘制任意大小的矩形或椭圆。

用户通过点击按钮,选择要绘制的矩形(rect)或者椭圆(oval),以及选择画笔的颜色(红色、蓝色、以及黑色)。绘制完成后,用户可以通过点击菜单条上的file菜单下的sava选项进行保存。

程序具体效果图:

注意:

           1.画笔的默认颜色为黑色。

2.需要先点击rect(矩形)或者oval(椭圆)按钮再进行绘制。

3.保存绘制的图形时,文件的后缀名应为jpg格式(即在文件名后面加上.jpg)。

4.矩形椭圆均为填充图形。

具体实现过程且看以下代码(代码内部有详细的注解)。

代码:

import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import static javax.swing.WindowConstants.EXIT_ON_CLOSE;public class PaintTest {//创建一个窗口private JFrame f=new JFrame("画板");//定义一个菜单条以及菜单和菜单项private JMenuBar jMenuBar;private JMenu file;private JMenuItem save=new JMenuItem("save");;//设置窗口大小private final int TABLE_HEIGHT=500;private final int TABLE_WIDTH=500;//初始化鼠标起始位置private int preX=-1;private int preY=-1;//获取鼠标松开位置private int lastX;private int lastY;//初始图形长宽;private int height;private int width;//初始化颜色;private Color color=Color.BLACK;//颜色按钮JButton red =new JButton("red");JButton blue =new JButton("blue");JButton black =new JButton("black");//矩形椭圆按钮JButton rect=new JButton("rect");JButton oval=new JButton("oval");//定义一个变量获取需要画的图形;String str="";//获取一个BufferedImage对象,调用该对象中的方法获取画笔BufferedImage image=new BufferedImage(TABLE_WIDTH,TABLE_HEIGHT,BufferedImage.TYPE_INT_BGR);Graphics g=image.getGraphics();//定义一个方法用于初始化变量public void initialize(){this.preX=-1;this.preY=-1;this.lastX=-1;this.lastY=-1;}//创建一个画布private class MyCanvas extends JPanel{@Overridepublic void paint(Graphics g) {//画位图,将本机图片复制到画布上去g.drawImage(image,0,0,null);if(str.equals("绘制矩形")){g.setColor(color);g.fillRect(Math.min(preX,lastX),Math.min(preY,lastY),Math.abs(lastX-preX),Math.abs(lastY-preY));}else if(str.equals("绘制椭圆")){g.setColor(color);g.fillOval(Math.min(preX,lastX),Math.min(preY,lastY),Math.abs(lastX-preX),Math.abs(lastY-preY));}}}MyCanvas myDraw=new MyCanvas();//自定义点击按钮发生颜色变化的方法private void setColor(Color redColor,Color blueColor,Color blackColor){red.setBackground(redColor);blue.setBackground(blueColor);black.setBackground(blackColor);}private void setColor(Color rectColor,Color ovalColor){rect.setBackground(rectColor);oval.setBackground(ovalColor);}//组装视图public void init(){JPanel colorGroup=new JPanel();colorGroup.add(red);colorGroup.add(blue);colorGroup.add(black);JPanel graphGroup=new JPanel();graphGroup.add(rect);graphGroup.add(oval);//定义一个点击事件处理器ActionListener actionListener=new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {//获取点击的内容String actionCommand = e.getActionCommand();//switch语句用于处理点击不同内容的事件处理switch (actionCommand){case "red"://设置按钮颜色setColor(Color.RED,Color.WHITE,Color.WHITE);//设置画笔颜色color=Color.RED;break;case "blue":setColor(Color.WHITE,Color.BLUE,Color.WHITE);color=Color.BLUE;break;case "black":setColor(Color.WHITE,Color.WHITE,Color.BLACK);color=Color.BLACK;break;case "rect":str="绘制矩形";//初始化变量initialize();setColor(Color.YELLOW,Color.WHITE);break;case "oval":str="绘制椭圆";//初始化变量initialize();setColor(Color.WHITE,Color.YELLOW);break;case "save"://保存画的图形FileDialog fileSave=new FileDialog(f,"open",FileDialog.SAVE);fileSave.setVisible(true);//获取文件名和文件位置String file = fileSave.getFile();String directory = fileSave.getDirectory();try {//解决空指针异常if(file==null||directory==null){return;}ImageIO.write(image,"JPEG" ,new File(directory,file));} catch (IOException ioException) {ioException.printStackTrace();}break;}}};//添加事件处理器red.addActionListener(actionListener);blue.addActionListener(actionListener);black.addActionListener(actionListener);rect.addActionListener(actionListener);oval.addActionListener(actionListener);save.addActionListener(actionListener);//设置画板为白色g.setColor(Color.white);g.fillRect(0,0,TABLE_WIDTH,TABLE_HEIGHT);//画布添加鼠标事件处理myDraw.addMouseListener(new MouseAdapter() {@Override//鼠标按下事件处理,用于获取鼠标按下时的位置public void mousePressed(MouseEvent e) {preX=e.getX();preY=e.getY();}//松开事件处理,用于获取鼠标松开后的位置public void mouseReleased(MouseEvent e) {lastX=e.getX();lastY=e.getY();//在image画布上画出相应图形if(str.equals("绘制矩形")){g.setColor(color);g.fillRect(Math.min(preX,lastX),Math.min(preY,lastY),Math.abs(lastX-preX),Math.abs(lastY-preY));initialize();}else if (str.equals("绘制椭圆")){g.setColor(color);g.fillOval(Math.min(preX,lastX),Math.min(preY,lastY),Math.abs(lastX-preX),Math.abs(lastY-preY));initialize();}}});//鼠标移动事件处理myDraw.addMouseMotionListener(new MouseMotionAdapter() {@Override//鼠标拖动事件处理,获取鼠标拖动实时位置public void mouseDragged(MouseEvent e) {lastX=e.getX();lastY=e.getY();myDraw.repaint();}});//设置画布大小myDraw.setPreferredSize(new Dimension(TABLE_WIDTH,TABLE_HEIGHT));//添加画布f.add(myDraw);//组装并添加菜单条jMenuBar=new JMenuBar();file=new JMenu("file");file.add(save);jMenuBar.add(file);f.setJMenuBar(jMenuBar);//将颜色按钮,图形按钮分别位于窗口的北方和南方f.add(colorGroup,BorderLayout.NORTH);f.add(graphGroup,BorderLayout.SOUTH);//设置窗口为一个合适大小f.pack();//设置窗口关闭功能f.setDefaultCloseOperation(EXIT_ON_CLOSE);f.setVisible(true);}public static void main(String[] args) {new PaintTest().init();}
}

Java绘制椭圆和矩形(实现自由变化大小的功能)相关推荐

  1. android paint 圆角 绘制_android 绘制椭圆 圆角矩形 详细解析

    1.前几天看别人博客上的一个自定义视图时,看到了一个空心圆环,然后学习了下,把自己理解的  函数参数的 方法跟大家说下,下面是一个自己做的简单例子 1.绘制矩形 RectF rect1 = aaane ...

  2. java 椭圆_用Java绘制椭圆

    这里有一些基本代码可以完成基础知识(不使用连续的while循环): import java.awt.Color; import java.awt.Container; import java.awt. ...

  3. open cv轮廓周围绘制圆形和矩形

    APIapproxPolyDP(精简多边形轮廓点数) 作用是把一个很多点的多边形变成一个点数适中的多边形 在这个多边形里面找它的最小连接矩形和最小的圆 approxPolyDP ( InputArra ...

  4. Fabric.js 自由绘制椭圆

    theme: smartblue 持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第2天,点击查看活动详情 本文简介 点赞 + 关注 + 收藏 = 学会了 本文讲解在 Fabric ...

  5. 了解什么是SVG并使用SVG绘制圆,椭圆,矩形

    一.了解SVG概念 SVG英文全称为Scalable Vector Graphics,意思为可缩放的矢量图 HTML5支持内联SVG HTML<svg>元素是图形的容器 SVG有多种绘制路 ...

  6. 图像处理控件功能演示: 在 C# 中绘制直线、圆弧、椭圆、矩形等形状

    Aspose.Imaging for .NET是一个可以让开发人员可以创建.编辑.画图.转换图像的图像处库,提供了一些开发平台原有功能基础之上的一些新特性.它独立于其他应用程序, Aspose.Ima ...

  7. OpenCV图像处理学习六,像素操作,使用line,ellipse,ellipse,rectangle,fillPoly函数绘制线、矩形、圆、椭圆等基本图形以及C++随机数产生器RNG的应用

    一.Point与Scalar 使用cv::Point与cv::Scalar Point表示2D平面上一个点x,y Point p; p.x = 10; p.y = 8; 或者 p = Pont(10, ...

  8. 计算机图形学笔记1--新建vs项目及绘制直线、矩形、椭圆

    项目创建--VS2019选择MFC应用,更改以下配置 :1.单个文档   2.MFC规范 绘制基础直线.矩形 void Ctest01View::OnLButtonUp(UINT nFlags, CP ...

  9. cad绘制椭圆的方法有几种_CAD新手入门教学:如何绘制矩形?

    各位热爱CAD的知友们,图图开了一个[电脑版的CAD教程]合辑,以后每周五给大家分享CAD教程啦,记得一定要来看呀!(仅为新手教学,大佬看见可直接说出更简易操作) 其实绘制矩形在CAD中来说,真的是一 ...

最新文章

  1. 启用 HTTP TRACE 方法
  2. 使用代码创建具有organization unit的opportunity
  3. Xtreme8.0 - Kabloom dp
  4. java 注解默认值
  5. Docker容器管理
  6. 力扣算法题—095不同的二叉搜索树【二叉树】
  7. python使用rpa需要什么插件_使用Python制作ArcGIS插件基础篇——工具介绍
  8. Spring 计划 7.0
  9. 三维旋转矩阵_线性代数的本质(4)--矩阵乘法与复合变换
  10. WINDOWS下简单操作SQLITE3
  11. 项目管理(PMBOK第六版)常用缩写中英文对照
  12. 广东理工学院计算机组成原理,20年广东理工学院成人高考期末考试 计算机组成原理 复习资料(7页)-原创力文档...
  13. 使用计算机时注意的,使用计算机时注意几点预防“鼠标手”
  14. Quality-Estimation1 (翻译质量评价-复现 WMT2018 阿里论文结果)
  15. 其他状态(非Buff/Debuff、异常状态的状态)
  16. 免费的 ChatGPT镜像网站
  17. 操作系统学习之文件管理:
  18. Brendan Eich谈Javascript的起源
  19. 消息中间件----内存数据库 Redis7(第3章 Redis 命令)
  20. 如何在所有用户的桌面创建快捷方式

热门文章

  1. 嘉曼服饰上市破发,大跌16%:公司市值37亿 刘溦家族色彩浓厚
  2. 【MySQL】必知必会知识点
  3. 计算机中的取余 ( % )
  4. (Python文件处理)doc文档转UTF-8格式的TXT文档
  5. macOS、Linux CentOS 、Docker安装部署canal-server(canal-deployer)服务
  6. 【游戏运营】【实战】首充分析——王国纪元
  7. 解读:基于订单流、技术分析与神经网络的期货短期走势预测模型
  8. js实现复制图片到剪切板下载图片
  9. java 163邮箱发邮件_Java实现163邮箱发送邮件到QQ邮箱
  10. python学习 day49之CSS网页布局